2009-08-14 14 views
2

Si vous avez une énumération à laquelle vous accédez par réflexion, comment passeriez-vous sa valeur dans l'appel à method.invoke?passez enum enum to method.invoke java

Serait-il quelque chose comme (présentée comme une méthode statique pour la simplicité)


    Class enumClazz = Class.forName("mypkg.MyEnum",true,MyClassLoader); 
    Class myReflectedClazz = Class.forName("mypkg.MyClass",true,MyClassLoader); 
    Field f = enumClazz.getField("MyEnumValue"); 

    Method m = myReflectedClazz.getMethod("myMethod",enumClazz); 
    m.invoke(null,f.get(null)); 
+2

avez-vous Essayé? – skaffman

+0

J'en doute - il ne compilera pas –

+0

Correct, je ne l'avais pas essayé, le f.get() est invalide, il aurait dû être f.get (null). Après correction, mon exemple fonctionne. –

Répondre

4

Vous devriez probablement faire:

Enum e = Enum.valueOf(enumClazz, "MyEnumValue"); 

Vous obtiendrez non vérifiées avertissements que vous utilisez des types bruts mais cela va compiler et fonctionner.

utilisant la réflexion, vous devrez passer une instance pour accéder à un Field - mais dans le cas des méthodes statiques, vous pouvez passer null à Field méthode de get comme suit:

m.invoke(null,f.get(null)); 

aussi - est myMethod une méthode static comme vous appelez cela sans instance aussi bien?

+0

Il utilisait le champ pour essayer d'obtenir une valeur enum. Avec votre code, il devrait être 'm.invoke (null, e)' – ChssPly76

+0

Oui, myMethod était statique. –

+0

@ ChssPly76 - Je pense que vous devez lire ma réponse à nouveau. Il y a mal avec ça –

0

Vous avez une définition enum:

public enum MyEnum { 
    MY_SAMPLE_ENUM 
} 

Et une classe qui a une méthode qui a un paramètre ENUM:

public class SampleClass { 
    public static void myMethod(MyEnum myEnumParam) { 
     // some logic here 
    } 
} 

invoquons SampleClass.myMethod(MyEnum.MY_SAMPLE_ENUM) par réflexion:

Class clazzMyEnum= Class.forName("mypkg.MyEnum", true, myClassLoader); 
Enum enum_MY_SAMPLE_ENUM = Enum.valueOf(clazzMyEnum, "MY_SAMPLE_ENUM"); 

Class clazzSampleClass = Class.forName("mypkg.SampleClass", true, myClassLoader); 
Method methodMyMethod = clazzSampleClass.getMethod("myMethod", clazzMyEnum); 
methodMyMethod.invoke(null, enum_MY_SAMPLE_ENUM);