2016-04-25 3 views
1

Ich habe versucht, etwas wie enum selbst zu implementieren. Während ich versuchte, meine konstanten Objekte zu iterieren, stieß ich auf Reflektion und stolperte über java.lang.reflect.Field. Also hier ist mein Szenario. Ich habe ein Unternehmen Klasse ein Paar String zum Halten KonstantenIteration mit Reflektion durch Objektkonstanten in einer Schnittstelle

public class ConstantEntity { 

    private String constantName; 
    private String constantDesc; 

    ConstantEntity(String name, String desc) { 
     this.constantName = name; 
     this.constantDesc = desc; 
    } 

    public String constantName() { 
     return this.constantName; 
    } 

    public String constantDesc() { 
     return this.constantDesc; 
    } 

} 

Und ich habe eine Schnittstelle, wo ich die Konstanten unter Verwendung der Einheit schaffen

public interface MyConstantsPool { 

    public static final ConstantEntity CONSTANT_ONE = new ConstantEntity("bla1", "11"); 
    public static final ConstantEntity CONSTANT_TWO = new ConstantEntity("bla2", "12"); 
    public static final ConstantEntity CONSTANT_THREE = new ConstantEntity("bla3", "13"); 


} 

Und ich versuche, durch diese Konstanten zu konsumieren und iterieren mit

import java.lang.reflect.Field; 

public class ConsumeConstants { 

    public static void main(String args[]) { 

     Field[] fields = MyConstantsPool.class.getDeclaredFields(); 
     for (int i = 0; i < fields.length; i++) { 

      Object myConstant = fields[i]; 
      ConstantEntity typeSafeEnum = (ConstantEntity) myConstant ; 
      System.out.println(" The name: " 
        + ((ConstantEntity) typeSafeEnum).constantName()); 
      System.out.println(" The description: " 
        + ((ConstantEntity) typeSafeEnum).constantDesc()); 

     } 
    } 
} 

Ich ging durch die Dokumentation, aber ich konnte die Idee hinter Field nicht erfassen. Habe ich ein völlig falsches Verständnis von Reflexion? Wann benutzen wir Field? Und was ist der richtige Weg, um alle Objektkonstanten in der Schnittstelle zu durchlaufen?

HINWEIS: Ich benutze Java 1.4; Also muss ich grundlegende Java-Funktionen verwenden, um dies zu implementieren.

Antwort

0

Field ist ein Accessor, die Sie und Operationen erhalten und auch tun Prüfung richte können, wie die Art oder Modifikatoren des Feldes zur Laufzeit entdecken.

Und was ist der richtige Weg, um alle Object-Konstanten in der Schnittstelle zu durchlaufen?

Wenn Sie alle Felder static ConstantEntity iterieren möchten, können Sie so etwas wie dies nutzen könnten:

Field[] fields = MyConstantsPool.class.getFields(); 
for (int i = 0; i < fields.length; i++) { 
    Field f = fields[i]; 
    if (ConstantEntity.class.isAssignableFrom(f.getType()) 
      && Modifier.isStatic(f.getModifiers())) { 
     ConstantEntity constant = 
      (ConstantEntity) f.get(null); 
    } 
} 

Bin ich im Verständnis völlig falsch Reflexion der Verwendung?

Aus dem Fehler im Code, versuchen myConstant direkt an ConstantEntity, zumindest teilweise zu werfen.Sie müssen get aufrufen, um den Wert in dem Feld tatsächlich abzurufen. Das Field Objekt selbst ist nur ein Accessor.

Sie können auch "What is reflection and why is it useful?"


Auch Java 1.4, wirklich sehen ??? Das ist mehr als 10 Jahre veraltet.

+2

Warum die Abstimmung runter? – Pshemo

+1

Schnittstellen können keine nicht statischen Felder haben, daher ist 'Modifier.isStatic (f.getModifiers()' wahrscheinlich redundant (es sei denn, ich habe Ihre Idee falsch verstanden). – Pshemo

+0

@Phemo Ja, Sie haben Recht, wenn Sie hier den Modifikator überprüfen weniger redundant Mein Code-Beispiel soll nur etwas allgemeiner sein. – Radiodef

0

Mit Java Reflection können Sie die Felder (Membervariablen) von Klassen überprüfen und zur Laufzeit abrufen/setzen.

eine Instanz einer Klasse gegeben, ist es möglich, Reflektion zu verwenden die Werte der Felder in dieser Klasse zu setzen. Dies geschieht in der Regel nur in besonderen Umständen, wenn die Einstellung der Werte in der üblichen Weise nicht möglich ist. Da ein solcher Zugriff in der Regel die Design-Absichten der Klasse verletzt, sollte es mit äußerster Diskretion verwendet werden.

So ein Class-Objekt verwendet werden kann, ein Field-Objekt für eine deklarierte Öffentlichkeit zu erhalten, geschützt deklarierte oder privaten Bereich erklärt.

Aber auch in Ihrem Fall könnte es für die "Design-Absicht" Ihrer Schnittstelle nützlich sein.

+0

@Radiodef „Ich ging durch die Dokumentation Aber ich konnte die Idee hinter Field nicht verstehen. Habe ich ein völlig falsches Verständnis von Reflektion? Wann benutzen wir Field? " Ich interpretierte die Frage wie: "Warum Reflexion verwenden? Wann ist nützlich? Was ist Ziel?" War ich falsch? – granmirupa

0

Warum können Sie nicht einfach Arrays anstelle von Reflektion verwenden?

public static final ConstantEntity CONSTANT_ONE = new ConstantEntity("bla1", "11"); 
public static final ConstantEntity CONSTANT_TWO = new ConstantEntity("bla2", "12"); 
public static final ConstantEntity CONSTANT_THREE = new ConstantEntity("bla3", "13"); 

public static final ConstantEntity[] CONSTANTS = { 
    CONSTANT_ONE, 
    CONSTANT_TWO, 
    CONSTANT_THREE 
}; 
1

Sie nur einfache Fehler gemacht, Sie greifen Field und versuchte, es zu Ihrer Klasse ConstantEntity,

Sie Wert von Feld bekommen müssen würfen

Object myConstant = fields[i].get(null);