Variablen eines Objektes (instanz) in einen Array lesen

Status
Nicht offen für weitere Antworten.

needJavaProz

Mitglied
Hallo zusammen.

ich möchte gerne alle variablen eines objektes auslesen und zwar in einen Array (Hashtable / set)

das untenstehende geht so nicht und wie ich in api gelesen habe würde das so oder so nur die statischen variablen / Felder auslesen. Ich hoffe fields sind für sun variablen.

Code:
	public void setVars(Object o) throws IllegalArgumentException, IllegalAccessException {
		Field[] allFields = o.getClass().getFields();
		for (Field fl : allFields) {
			for (String key : resFields.keySet()) {
				if (fl.getName() == key) {
					fl.set(fl, resFields.get(key));
					
				}
			}
		}
	}

ich bräuchte aber alle varbiablen einer Klasseninstanz am besten als string für vergleich und so.

gibt es da irgendeine Möglichkeit das zu machen.

Danke und Gruss
Thomas
 
> fl.set(fl, resFields.get(key))

was bringt das denn?
dass man einem Objekt x als Parameter x selber übergibt ist doch sehr ungewöhnlich, in diesem Fall falsch,
o könntest du übergeben

> if (fl.getName() == key) {

Strings mit equals vergleichen!

> das untenstehende geht so nicht

der Code hat ja auch wenig mit Auslesen zu tun, eher mit Setzen (set vs get)

> wie ich in api gelesen habe würde das so oder so nur die statischen variablen / Felder auslesen

wo hast du das denn gelesen, kann ich nicht bestätigen,

-----

die zentrale Operation ist get von Field,
da bekommst du ein Objekt,
wie du daraus einen String machst hängt von dir und dem jeweiligen Objekt ab,
im einfachen Falle toString() aufrufen
 
hmm, die einzige Möglichkeit, statische von nichtstatischen Feldern zu unterscheiden,
scheint Field.getModifers() zu sein,

Modifier.isStatic(fl.getModifiers())
 
also prinzipiell hab ich einfach nen hashtable mit key / value wobei key = name der variable sein wird

und damit ich nicht für jede einzelne variable um den wert einzufüllen ne funktion schreiben muss werde also sprich (preis key preis gehe in variable preis)...


deshalb möchte ich über alle variablen loopen und dann schauen ist in meinem hashtable ein key dem namen einer variable und dann den wert dort reinpflanzen.

und das könnte ich dann bei all den provisionen anwenden und löcker einfach alles ins hashtable und vars und gut is.


o.getClass gibt die klassenvariable zurück oder die instanz?
ich mein mit this wär am schönsten aber bei this.getClass steht:


Returns the runtime class of this object. The returned object is that that is locked by static synchronized methods (so ähnlich)

das mit der api hab ich verwechselt.

cheers
Tom






???:L
 
> o.getClass gibt die klassenvariable zurück oder die instanz?

liefert ein Class-Objekt

"hello".getClass()
liefert String.class, ein Objekt der Klasse Class

falls noch andere Fragen waren, dann nicht deutlich genug 😉
 
this.getClass.getFields();

naja ich sollte mal die api genauer lesen oder so, das zeugs oben gibt statisch zurück.

aber:
this.getClass.getDeclaredFields

gibt die instanz vars zurück.

trotzdem danke für die hilfe
peace
Tom
 
ah, du hast wahrscheinlich nur statische Variablen auf public gesetzt,
denn getFields() liefert nur public zurück, wie ich gerade auch erst getestet/ nachgelesen ( :bae: ) habe
Code:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        new A().test();
        new B().test();
    }
}


class A
{
    private int a;
    public int publicA;
    public static int staticA;

    public void test()
    {
        Class c = this.getClass();
        System.out.println("\nteste Objekt der Klasse " + c);
        System.out.println("\ngetFields:");
        for (Field fl : c.getFields())
        {
            System.out.println(fl.getName() + ", " + Modifier.isStatic(fl.getModifiers()));
        }
        System.out.println("\ngetDeclaredFields:");
        for (Field fl : c.getDeclaredFields())
        {
            System.out.println(fl.getName() + ", " + Modifier.isStatic(fl.getModifiers()));
        }
    }
}


class B
    extends A
{
    private int b;
    public int publicB;
    public static int staticB;

}
bei getDeclaredFields gibts noch ne Besonderheit, aber alles Lesevergnügen in der API will ich dir ja nicht nehmen
 
stimmt du hast recht :toll:

das getDeclared nimmt die private das andere die public 🙂

gilt auch für die methoden:

hier mit kapselung 🙂

Code:
	public void setVars() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {					
		
		Method[] allMethods = this.getClass().getMethods();
		for (Method m : allMethods) {
			for (String key : resFields.keySet()) {
				System.out.println("set" + key);
				System.out.println(m.getName());
				if (m.getName().equalsIgnoreCase("set" + key)) {
					
					m.invoke(this, resFields.get(key));
					
				}
			}
		}
	}


thanks a lot 😀
Tom
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben