tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
2656
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    stso stso ist offline Mitglied Bronze
    Registriert seit
    Jan 2007
    Beiträge
    41
    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!?
    Code :
    1
    
    Field field = aClass.getClass().getField("publicAbstractField");
    Das geht - aber icht mit der protected Variable.

    Gibt es eine Möglichkeit auf die Variable "abstractField" über das Class- Object der Klasse AClass zuzugreifen?
     

  2. #2
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    in dem Fall müsstest du es so machen.
    Code :
    1
    
    Field field = aClass.getClass().getSuperclass().getDeclaredField("abstractField");

    MFG

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  3. #3
    stso stso ist offline Mitglied Bronze
    Registriert seit
    Jan 2007
    Beiträge
    41
    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(?):
    Code :
    1
    
    Field field = aClass.getClass().getSuperclass().getSuperclass().getDeclaredField("aField");
    Und wenn ich auf Variablen einer beliebigen "Vorfahrklasse" zugreifen möchte?
    Da muss ich mir wohl eine Methode Schreiben die alle Superklassen einer Klassen nach einer Variable durchsucht?
     

  4. #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ß Tom
     
    Java 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

  5. #5
    Alex77 Alex77 ist offline Grünschnabel
    Registriert seit
    Nov 2007
    Beiträge
    1
    Ich möchte noch das gute Beispiel von Thomas um zwei wichtige Zeilen erweitern:

    PHP-Code:
        public static void main(String[] argsthrows 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));
        } 
    Noch eine weitere Anmerkung mit Protected: Problem bei mir war noch, dass der Compiler sagte:
    can not access a member of class XYZ.ABC with modifiers "protected"
    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 wieder
    Geändert von Alex77 (26.05.09 um 21:50 Uhr)
     

Ähnliche Themen

  1. Java Reflection Object ein Interface implemetieren
    Von raphael_fehlmann im Forum Java
    Antworten: 10
    Letzter Beitrag: 05.09.10, 14:43
  2. Java Reflection, Commit und Validierung
    Von MS-Tech im Forum Java
    Antworten: 3
    Letzter Beitrag: 17.08.10, 15:13
  3. Antworten: 3
    Letzter Beitrag: 06.12.08, 22:04
  4. Antworten: 2
    Letzter Beitrag: 03.05.07, 23:08
  5. Reflection in Java 1.5
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 12.03.04, 14:58