2010-05-19 10 views
11

im Grunde muss ich eine Konstante für eine Klasse zu bekommen, aber ich habe keine Instanz des Objekts, sondern nur seine Klasse. In PHP würde ich tun constant(XYZ); Gibt es eine ähnliche Möglichkeit zum Abrufen einer Konstante in JAVA?Wie bekomme ich eine Konstante in Java mit Klasse

Ich brauche es einen dynamischen getMethod Aufruf zu erleichtern

Class parameterType = Class.forName(class_name); 
object.setProperty(field name, field value, parameterType); 

die eingestellte Eigenschaft Methode dann die richtige Methode bekommen würde und die angegebene Eigenschaft gesetzt ist, aber ich kann nicht ein Verfahren erhalten, das int als Parameter-Typ hat, ohne Interger.TYPE

Antwort

0

Ich bin mir nicht sicher, was Sie raus wollen. Aber es sollte nicht zu schwierig sein, Ihnen ein Beispiel zu zeigen.

Nehmen wir an, Sie haben eine Klasse Foo mit Eigenschaftsleiste. Ich

Class fooClass = Foo.class; 
Object fooObj = fooClass.newInstance(); 
Method fooMethod = fooClass.getMethod("getBar"); 
String bar = (String) fooMethod.invoke(fooObj); 

Nun werden Sie Wert Methode GetBar() in bar variable

2

erhalten Wenn diese Konstante Metadaten über die Klasse,:

Class Foo { 
    private final String bar = "test"; 
    public String getBar() {return bar;} 
} 

Nun ist diese durch Reflexion erhalten würden Sie ‚d tut dies mit annotations:

Ersten Schritt, erklärt die Anmerkung:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@interface Abc { 
    String value(); 
} 

Schritt zwei, mit Anmerkungen versehen Klasse:

@Abc("Hello, annotations!") 
class Zomg { 

} 

Schritt drei, rufen Sie den Wert:

String className = "com.example.Zomg"; 
Class<?> klass = Class.forName(className); 
Abc annotation = klass.getAnnotation(Abc.class); 
String abcValue = annotation.value(); 
System.out.printf("Abc annotation value for class %s: %s%n", className, abcValue); 

Ausgang ist:

Abc annotation value: Hello, annotations!
0

Vielleicht verstehe ich nicht, was Du brauchst, aber hast du es mit statischen Attributen und statischen Methoden versucht?

Finale bedeutet, dass es nicht einmal geändert werden kann, so dass Sie eine Konstante erhalten. Statisch bedeutet, dass es zugänglich ist, auch wenn keine Objekte der Klasse vorhanden sind.

28

Sie könnten nach etw. Suchen. wie
Foo.class.getDeclaredField("THIS_IS_MY_CONST").get(null); oder Class.forName("Foo").getDeclaredField("THIS_IS_MY_CONST").get(null); (dank f-o-o)

Ruft den Wert einer String-Konstante (THIS_IS_MY_CONST) in der Klasse Foo.

aktualisieren Verwendung null als Argument für get dank acdcjunior

+1

Beachten Sie, dass die 'String.class' Argument der' Feld # get übergeben (Object) 'Methode für statische Felder strittig ist - pro javadoc: > Wenn das zugrunde liegende Feld ein statisches Feld ist, wird das Argument obj ignoriert. Es kann null sein. Das Argument bedeutet also nicht, dass der Feldwert ein String ist und null sein könnte. – superEb

+4

Da es sich um ein 'statisches' Feld handelt, ist' Foo.class.getDeclaredField ("MY_CONST"). Get (null); 'der richtige Weg, um seinen Wert zu erhalten. (Das Argument 'String.class' in der Antwort wird ignoriert und ist tatsächlich irreführend.) – acdcjunior

+0

Was, wenn Sie nicht wissen, was Foo ist? Ich denke Class.forName ("Foo") wäre idealer. –

Verwandte Themen