2010-05-19 8 views
11

in pratica ho bisogno di ottenere una costante per una classe, ma non ho alcuna istanza dell'oggetto ma solo la sua classe. In PHP vorrei fare constant(XYZ); C'è un modo simile di recuperare una costante in JAVA?come ottenere una costante in java con classe

ho bisogno di facilitare una chiamata getMethod dinamica

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

il metodo di proprietà set sarebbe quindi ottenere il metodo corretto e impostare la proprietà specificata, tuttavia non posso ottenere un metodo che ha int come tipo di parametro senza usare Interger.TYPE

risposta

0

Non sono sicuro di cosa vogliate uscire. Ma non dovrebbe essere troppo difficile mostrarti un esempio.

Diciamo che hai una classe Foo con barra proprietà.

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

ora per ottenere questo attraverso la riflessione si farebbe:

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

Ora si otterrà valore del metodo GetBar() in variabili bar

2

Se questa costante è metadati sulla classe, ho 'd farlo con annotations:

primo passo, dichiara l'annotazione:

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

Fase due, annotare la classe:

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

} 

Fase tre, recuperare il valore:

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); 

uscita è:

Abc annotation value: Hello, annotations!
0

Forse non capisco cosa hai bisogno, ma hai provato con gli attributi statici finali e i metodi statici?

Final significa che non può essere modificato una volta impostato, in modo da ottenere una costante. Statico significa che è accessibile anche se non ci sono oggetti della classe.

28

Si potrebbe cercare sth. come
Foo.class.getDeclaredField("THIS_IS_MY_CONST").get(null); o Class.forName("Foo").getDeclaredField("THIS_IS_MY_CONST").get(null); (grazie f-o-o)

Ottiene il valore di una stringa costante (THIS_IS_MY_CONST) nella classe Foo.

Aggiornamento uso null come argomento per get grazie acdcjunior

+1

Nota che l'argomento 'String.class' passato al campo # get (Object)' 'metodo è discutibile per i campi statici - per javadoc: > Se il campo sottostante è un campo statico, l'argomento obj viene ignorato; potrebbe essere nullo. Quindi l'argomento non implica che il valore del campo sarà una stringa e potrebbe essere nullo. – superEb

+4

Poiché è un campo 'static',' Foo.class.getDeclaredField ("MY_CONST"). Get (null); 'è il modo corretto per ottenere il suo valore. (L'argomento 'String.class' nella risposta è ignorato e in realtà fuorviante.) – acdcjunior

+0

Cosa succede se non sai cos'è Foo? Penso che Class.forName ("Foo") sarebbe più ideale. –

Problemi correlati