String als Methoden- oder Variablennamen verwenden

Moltar

Mitglied
Hallo,

ist es irgendwie möglich, einen String zu verwenden, um auf eine gleichnamige Methode, Variable, Klasse, etc. zuzugreifen?

Code:
String name = "TestKlasse()";
Object o = new StringToClass(name);

oder noch besser:

Code:
String name = "TestKlasse()";
Object o = new name;

Gibt es etwas vergleichbares?

Hintergrund ist: Ich würde gerne eine Zuordnung zwischen Namen von Objekten (und Klassen) in einer Datenbank und deren Tatsächlichen Klassennamen herstellen.

Grüße und danke
Moltar
 
Ja, "Reflection" ist genau das Stichwort :)

Ich hab gerade mal was zusammen gebastelt. Funktioniert zumindest bei Klassen und Methodennamen (auch wenn man bei Klassen eine neue Instanz erzeugen muss).
Mit Variablen müsste es auch gehen über getField() - aber das macht keinen Sinn, wenn die Instanz der Klasse gerade erst erzeugt worden ist :)
Wenn man die Parameter nicht kennt, die die Methoden haben, kann man sich auch einfach sämtliche Methoden anzeigen lassen und dann nach dem richtigen suchen ...

Code:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Test {

	String className = "Test";
	String methodName = "Ausgabe";
	
	public void reflectionTest() {
		try {
			Class c = Class.forName(className);
			Object object = c.newInstance();
			Method method = object.getClass().getMethod(methodName, new Class[] {});
			method.invoke(object, new Object [] {});
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}
	
	public void Ausgabe() {
		System.out.println("Hallo");
	}
	
	public static void main (String [] args) {
		Test t = new Test();
		t.reflectionTest();
	}
}
 
Du musst halt nur ein Object erzeugen, wenn du noch keins hast. Hier ist mal ein Beispiel wie du in einer Klasse ihre eigene Methode aufrufst, ohne ein neues Object zu erzeugen.

Java:
package de.tutorials.reflection;

import java.lang.reflect.Method;

public class ReflectionExample {

	
	public ReflectionExample() {
		try {
			Class clazz = Class.forName("de.tutorials.reflection.ReflectionExample");
			Method method = clazz.getDeclaredMethod("gibWasAus", new Class[]{});
			
			method.invoke(this);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void gibWasAus(){
		System.out.println("test");
	}
	
	public static void main(String[] args) {
		new ReflectionExample();
	}
}

MFG

zEriX
 
Hi!

Ich bin begeistert, hätte nicht gedacht, dass eine doch so einfach Lösung gibt.

Danke euch beiden :-)

Grüße Moltar
 
Hier noch ein Beispiel wie du an Variablen kommst und diese auch neu setzen kannst.

Java:
package de.tutorials.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionExample {

	private  String test = "Hello World :-)";
	
	public ReflectionExample() {
		try {
			Class clazz = Class.forName("de.tutorials.reflection.ReflectionExample");
			Method method = clazz.getDeclaredMethod("gibWasAus", new Class[]{});
			Field field = clazz.getDeclaredField("test");
			method.invoke(this);
			
			System.out.println(field.get(this));
			
			field.set(this, "Test nochmal");
			
			System.out.println(field.get(this));
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void gibWasAus(){
		System.out.println("test");
	}
	
	public static void main(String[] args) {
		new ReflectionExample();
	}
}

MFG

zEriX
 
Du kannst so auch auf private Methoden anderer Klassen zugreifen, allerdings musst du dann
Code:
method.setAccessible(true);
bzw
Code:
field.setAccessible(true);

setzen.

MFG

zEriX
 
Zurück