2010-05-19 6 views
11

fondamentalement j'ai besoin d'obtenir une constante pour une classe mais je n'ai aucune instance de l'objet mais seulement sa classe. En PHP, je ferais constant(XYZ); Existe-t-il un moyen similaire de récupérer une constante dans JAVA?comment obtenir une constante dans Java avec la classe

J'ai besoin pour faciliter un appel getMethod dynamique

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

la méthode de propriété ensemble alors obtenir la bonne méthode et définir la propriété spécifiée, mais je ne peux pas obtenir une méthode qui a int comme type de paramètre sans utiliser Interger.TYPE

Répondre

0

Je ne suis pas sûr de ce que vous voulez sortir. Mais il ne devrait pas être trop difficile de vous montrer un exemple.

Disons que vous avez un Class Foo avec une barre de propriétés.

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

Maintenant, pour obtenir ce à travers la réflexion vous devez:

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

Maintenant, vous obtiendrez la valeur de la méthode GetBar() dans la variable bar

2

Si cette constante est des métadonnées sur la classe, je « d faire avec annotations:

Première étape, déclarer l'annotation:

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

Étape deux, annoter votre classe:

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

} 

Troisième étape, récupérer la valeur:

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

sortie est:

Abc annotation value: Hello, annotations!
0

Peut-être que je ne comprends pas ce que vous avez besoin, mais avez-vous essayé avec les attributs statiques finaux et les méthodes statiques? Finale signifie qu'il ne peut pas être changé une fois réglé, donc vous obtenez une constante. Statique signifie qu'il est accessible même s'il n'y a aucun objet de la classe.

28

Vous pourriez rechercher sth. comme
Foo.class.getDeclaredField("THIS_IS_MY_CONST").get(null); ou Class.forName("Foo").getDeclaredField("THIS_IS_MY_CONST").get(null); (grâce f-o-o)

Obtient la valeur d'une constante de chaîne (THIS_IS_MY_CONST) dans la classe Foo.

Mise à jour utilisation null comme argument pour get grâce acdcjunior

+1

Notez que l'argument 'String.class' transmis à la méthode champ' # get (Object) 'est sans objet pour les champs statiques - par la javadoc: > Si le champ sous-jacent est un champ statique, l'argument obj est ignoré; ça peut être nul. Donc l'argument n'implique pas que la valeur du champ sera une chaîne et pourrait être nulle. – superEb

+4

Comme c'est un champ 'static',' Foo.class.getDeclaredField ("MY_CONST"). Get (null); 'est la bonne façon d'obtenir sa valeur. (L'argument 'String.class' dans la réponse est ignoré et trompeur.) – acdcjunior

+0

Et si vous ne savez pas ce qu'est Foo? Je pense que Class.forName ("Foo") serait plus idéal. –