2016-06-07 12 views
0

In Java können Sie schreiben:Entspricht „Abc.class.getName()“ für Felder

System.out.println(Abc.class.getName());

Es wird immer den richtigen Wert drucken, auch wenn die Klasse Abc verschoben oder umbenannt wird.

Was ist für Feldnamen am nächsten?

Mit anderen Worten, was kann ich Code, der mir immer den "aktuellen" Namen eines Feldes in einer Klasse geben wird, auch wenn dieses Feld umbenannt wird. Im Idealfall würde es auch nicht kompilieren, wenn das Feld vollständig entfernt wird. Oder zumindest fehlgeschlagen, sobald auf die Klasse zugegriffen wird, während der statischen Initialisierung.

Ich möchte dies ein "Change Tracking" -System zu vereinfachen. Es ist nicht ganz wie "Bean-Eigenschaften", weil diese Namen außerhalb der Klasse selbst nicht sichtbar sind.

AFAIK, gibt es keine "native" Möglichkeit, dies zu tun, aber ich hoffe, dass es einen Trick mit Anmerkungen und/oder Reflexion, die die Arbeit macht.

Ich werde schreiben, was ich jetzt tue (minimal vereinfacht):

private static final String IS_SWAPPABLE = "isSwappable"; 
// ... 
private boolean isSwappable; 
// ... 
public boolean isSwappable() { 
    if ((clientChanges != null) && 
        clientChanges.containsKey(IS_SWAPPABLE)) { 
     return (Boolean) clientChanges.get(IS_SWAPPABLE); 
    } 
    return isSwappable; 
} 

public boolean setSwappable(final boolean newSwappable) { 
    if (isSwappable() != newSwappable) { 
     isSwappable = newSwappable; 
     onFieldChange(IS_SWAPPABLE, newSwappable); 
     return true; 
    } 
    return false; 
} 

Was würde Ich mag einige „Magie“, die den Wert von IS_SWAPPABLE auf „isSwappable“ so setzt, dass, wenn isSwappable ist umbenannt, dann wird IS_SWAPPABLE entsprechend aktualisiert.

OTOH, wenn es eine Syntax wie Abc.isSwappable (oder AbC# isSwappable) oder was auch immer gab, würde ich mir die Konstante ersparen, und schreibe das direkt.

Was ich tun kann atm ist (einmal) über die Konstanten gehen (durch die Verwendung einiger klarer Benennungskonvention), und stellen Sie sicher, dass für jede von ihnen gibt es ein Instanzfeld mit dem gleichen Namen. Es garantiert jedoch nicht wirklich, dass IS_SWAPPABLE verwendet wird, wenn isSwappable verwendet wird.

+1

http://stackoverflow.com/questions/13554583/is-it-possible-to-reflect -a-java-method-statisch –

+1

[Warum MyClass.class existiert in Java und MyField.field nicht?] (http://stackoverflow.com/questions/4485875/why-myclass-class-exists-in-java -and-myfield-field-isnt) –

+0

'auch wenn die Klasse Abc verschoben oder umbenannt wird.' In welchem ​​Sinne? Wenn Sie die Klasse Abc entfernen, wird Ihr Programm weder kompiliert noch kann es ausgeführt werden! – Michal

Antwort

-1

Es sieht sehr einfach aus.

for (Field field : getClass().getFields()) { 
     System.out.println(field.getName()); 
    } 

Dann können Sie Felder mit Ihren eigenen Anmerkungen markieren und lesen dann ihre Werte wie diese

for (Field field : getClass().getFields()) { 
     System.out.println(field.getName()); 
     MyAnnotation annotation = field.getAnnotation(MyAnnotation.class); 
     System.out.println(annotation.value()); 
    } 
+0

Ich denke, du verstehst ihre Frage falsch. –

+0

Er will direkten Zugang zum Feld bekommen. Da es keinen solchen gibt, schlage ich einen Workaround vor. – omickron

+0

Ich sehe nicht, wie das für mich nützlich ist. Ich möchte nicht den Namen aller Felder, sondern den Namen eines bestimmten Feldes. Wenn ich ein Feld "Alter" habe, möchte ich den "Namen" dieses Feldes im Getter und Setter dieses Feldes verwenden. Natürlich kann ich den Namen aller Felder irgendwo im Code bekommen, aber ich werde nicht wissen, auf welches von denen das Feld ist, auf das ich im tatsächlichen Getter/Setter zugreife. Atm, ich gebe gerade den Namen als eine Zeichenkette ein, aber wenn jemand den Code umgestaltet, stimmt die Zeichenkette nicht mit dem realen Feldnamen überein. –