ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
2656
2656
EMPFEHLEN
-
Hallo,
ist es mit java.lang.reflect möglich auf eine geerbte protected Variable zuzugreifen?
Ich hab zwei Klassen "AnAbstractClass" und "AClass":
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
public class AnAbstractClass { protected int abstractField; public int publicAbstractField; public int getAbstractField() { return abstractField; } public void setAbstractField(int abstractField) { this.abstractField = abstractField; } }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public class AClass extends AnAbstractClass { private int field; public AClass(int field) { super(); this.field = field; } public int getField() { return field; } public void setField(int field) { this.field = field; } }
Nun möchte ich von ausserhalb auf die Variable "abstractField" in AnAbstractClass über AClass zugreifen. Ich weiß das ich auf alle in der Klasse deklarierten Variablen über Class.getDeclaredField() zugreifen kann. Für die variable "field" würde das so aussehen:
Code :1 2
AClass aClass = new AClass(42); Field field = aClass.getClass().getDeclaredField("field");
Jedoch für die geerbte Variable geht das nicht. Führe ich den untenstehenden Code aus, wird mir gesagt das es die Klassenvariable "abstractField" nicht gibt.
Code :1
Field field = aClass.getClass().getDeclaredField("abstractField");
Mit der Methode getField() kann man leider nur auf die public Variablen zugreifen!?
Das geht - aber icht mit der protected Variable.Code :1
Field field = aClass.getClass().getField("publicAbstractField");
Gibt es eine Möglichkeit auf die Variable "abstractField" über das Class- Object der Klasse AClass zuzugreifen?
-
Hallo,
in dem Fall müsstest du es so machen.
Code :1
Field field = aClass.getClass().getSuperclass().getDeclaredField("abstractField");
MFG
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
Hallo Sascha,
viele Dank für deine Antwort! Wenn ich die JavaDoc richtig verstehe gibt getSuperclass() die direkte "Elternklasse" der aktuellen Klasse zurück? Wenn ich zum Beispiel auf eine Variable in "Object" zugreifen möchte müsste ich folgendes schreiben(?):
Und wenn ich auf Variablen einer beliebigen "Vorfahrklasse" zugreifen möchte?Code :1
Field field = aClass.getClass().getSuperclass().getSuperclass().getDeclaredField("aField");
Da muss ich mir wohl eine Methode Schreiben die alle Superklassen einer Klassen nach einer Variable durchsucht?
-
13.05.08 17:05 #4
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
wenn du den Type doch sowieso schon weißt, kannst du denn doch auch explizit angeben.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/** * */ package de.tutorials; import java.lang.reflect.Field; /** * @author Thomas.Darimont * */ public class ReflectionExample { /** * @param args */ public static void main(String[] args) throws Exception { Foo foo = new Foo(); System.out.println(getFieldValueInContextOfClass(Foo.class,"barbar",foo)); System.out.println(getFieldValueInContextOfClass(AbstractFoo.class,"bar",foo)); } public static Object getFieldValueInContextOfClass(Class<?> clazz, String fieldName, Object instance) throws Exception{ Field field = clazz.getDeclaredField(fieldName); return field.get(instance); } static class AbstractFoo{ protected String bar ="bar"; } static class Foo extends AbstractFoo{ protected String barbar = "barbar"; } }
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Ich möchte noch das gute Beispiel von Thomas um zwei wichtige Zeilen erweitern:
Noch eine weitere Anmerkung mit Protected: Problem bei mir war noch, dass der Compiler sagte:PHP-Code:public static void main(String[] args) throws Exception {
Foo foo = new Foo();
System.out.println(getFieldValueInContextOfClass(Foo.class,"barbar",foo));
System.out.println(getFieldValueInContextOfClass(AbstractFoo.class,"bar",foo));
//System.out.println(getFieldValueInContextOfClass(Foo.class,"bar",foo)); // NoSuchFieldException ! Vergl. mit nächster Zeile
System.out.println(getFieldValueInContextOfClass(Foo.class.getSuperclass(),"bar",foo));
}
Lösung war: die andere Klasse hatte ich zum Herumprobieren irgendwann mal dummerweise in ein anderes Package gelegt. Musste die Klasse ins gleiche package packen, dann gings wiedercan not access a member of class XYZ.ABC with modifiers "protected"
Geändert von Alex77 (26.05.09 um 21:50 Uhr)
Ähnliche Themen
-
Java Reflection Object ein Interface implemetieren
Von raphael_fehlmann im Forum JavaAntworten: 10Letzter Beitrag: 05.09.10, 14:43 -
Java Reflection, Commit und Validierung
Von MS-Tech im Forum JavaAntworten: 3Letzter Beitrag: 17.08.10, 15:13 -
Reflection benutzen um 2-te Java zu starten
Von kutamn im Forum JavaAntworten: 3Letzter Beitrag: 06.12.08, 22:04 -
Java Reflection: getPackage(...) liefert immer null
Von DarthShader im Forum JavaAntworten: 2Letzter Beitrag: 03.05.07, 23:08 -
Reflection in Java 1.5
Von Thomas Darimont im Forum JavaAntworten: 0Letzter Beitrag: 12.03.04, 14:58





Zitieren


Login





