Reflection, Ausgabe der Werte von INstanzvariablen möglich?

elmato

Erfahrenes Mitglied
Aloha, ich habe mal ne frage,
ist es möglich mittels Reflection auf die Werte von Feldern(Instanzvariablen) zuzugreifen?
Beim beschäftigen mit der Api habe ich die Field.getXXX Methoden gefunden, jedoch verstehe ich nicht so ganz wie sie zu benutzen sind und wenn ich testweise versuche einen Wert auszugeben bekomme ich immer nur eine IllegalArgumentException. Hätte da jemand ein kleines Beispiel am besten mit Strings?

Vielen Dank
elmato
 
Hallo elmato,

hab mal auf die schnelle eine Testklasse geschrieben. Was ich feststellen konnte ist, das nur die public deklarierten Elemente ausgegeben werden. Da aber Instanzvariablen in der Regel private deklariert sind, könntest du dir bspw. die Getter und Setter ausgeben lassen, aus denen wären dann die Anzahl und Typ der Instanzvariablen ersichtlich.

Java:
public class ReflectionExample {

	private String attribut1 = "Attribut1";

	double attribut2 = 3.0;

	protected char attribut3 = 'a';

	public int attribut4 = 5;

	public ReflectionExample(String attribut1, double attribut2, char attribut3, int attribut4) {
		this.attribut1 = attribut1;
		this.attribut2 = attribut2;
		this.attribut3 = attribut3;
		this.attribut4 = attribut4;
	}

	public ReflectionExample() {
	}

	public static void main(String[] args) {
		ReflectionExample r1 = new ReflectionExample();
		ReflectionExample r2 = new ReflectionExample("Test", 2.0, 'f', 9);

		System.out.println("Fields:");
		ReflectionExample.printArray(r1.getClass().getFields());
		ReflectionExample.printArray(r2.getClass().getFields());
		System.out.println("Constructors:");
		ReflectionExample.printArray(r1.getClass().getConstructors());
		ReflectionExample.printArray(r2.getClass().getConstructors());
		System.out.println("Methods:");
		ReflectionExample.printArray(r1.getClass().getMethods());
		ReflectionExample.printArray(r2.getClass().getMethods());

	}

	public static void printArray(Object[] o) {
		for (int i = 0; i < o.length; i++) {
			System.out.println(o[i]);
		}
		System.out.println();
	}

	public String getAttribut1() {
		return attribut1;
	}

	public void setAttribut1(String attribut1) {
		this.attribut1 = attribut1;
	}

	public double getAttribut2() {
		return attribut2;
	}

	public void setAttribut2(double attribut2) {
		this.attribut2 = attribut2;
	}

	public char getAttribut3() {
		return attribut3;
	}

	public void setAttribut3(char attribut3) {
		this.attribut3 = attribut3;
	}

	public int getAttribut4() {
		return attribut4;
	}

	public void setAttribut4(int attribut4) {
		this.attribut4 = attribut4;
	}
}

Code:
Fields:
public int ReflectionExample.attribut4

public int ReflectionExample.attribut4

Constructors:
public ReflectionExample(java.lang.String,double,char,int)
public ReflectionExample()

public ReflectionExample(java.lang.String,double,char,int)
public ReflectionExample()

Methods:
public static void ReflectionExample.printArray(java.lang.Object[])
public java.lang.String ReflectionExample.getAttribut1()
public void ReflectionExample.setAttribut1(java.lang.String)
public double ReflectionExample.getAttribut2()
public void ReflectionExample.setAttribut2(double)
public char ReflectionExample.getAttribut3()
public void ReflectionExample.setAttribut3(char)
public int ReflectionExample.getAttribut4()
public void ReflectionExample.setAttribut4(int)
public static void ReflectionExample.main(java.lang.String[])
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public java.lang.String java.lang.Object.toString()

public static void ReflectionExample.printArray(java.lang.Object[])
public java.lang.String ReflectionExample.getAttribut1()
public void ReflectionExample.setAttribut1(java.lang.String)
public double ReflectionExample.getAttribut2()
public void ReflectionExample.setAttribut2(double)
public char ReflectionExample.getAttribut3()
public void ReflectionExample.setAttribut3(char)
public int ReflectionExample.getAttribut4()
public void ReflectionExample.setAttribut4(int)
public static void ReflectionExample.main(java.lang.String[])
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public java.lang.String java.lang.Object.toString()


Vg Erdal
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials.spring.training;

import java.lang.reflect.Field;

/**
 * @author TDarimont
 * 
 */
public class ReflectionExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Bubu bubu = new Bubu("aPrivate","aProtected","aPackageProtected");
        bubu.aStaticPackageProtectedValue = "aStaticProtected";
        
        
        for(Field field : bubu.getClass().getDeclaredFields()){
            field.setAccessible(true);
            System.out.println(field.getName() + " contains: " + field.get(bubu));
        }
    }
    
    static class Bubu{
        private String aPrivateValue;
        protected String aProtectedValue;
        String aPackageProtectedValue;
        static String aStaticPackageProtectedValue;
        public Bubu(String privateValue, String protectedValue, String packageProtectedValue) {
            super();
            aPrivateValue = privateValue;
            aProtectedValue = protectedValue;
            aPackageProtectedValue = packageProtectedValue;
        }
    }

}

Gruß Tom
 
Uiii, schick, vielen Dank, hatte es in der zwischen Zeit auch schon mit gettern gelöst, werde es wohl auch so belassen, aber trotzdem ist es für spätere Zwecke bestimmt nützlich direkt auf die Variablen zugreifen zu können..
 
Zurück