如果您有通过反射访问的枚举,您将如何将其值传递给method.invoke调用。
它会是什么样的(显示为简单的静态方法)
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));
答案 0 :(得分:4)
您应该这样做:
Enum e = Enum.valueOf(enumClazz, "MyEnumValue");
当您使用原始类型时,您将收到未选中警告,但这将编译并运行。
使用反射,您需要传递一个实例来访问Field
- 但是对于静态方法,您可以将null
传递给Field
的{{1方法如下:
get
另外 - m.invoke(null,f.get(null));
是一个myMethod
方法,因为你调用它也没有实例吗?
答案 1 :(得分:0)
你有一个枚举定义:
public enum MyEnum {
MY_SAMPLE_ENUM
}
一个具有枚举参数的方法的类:
public class SampleClass {
public static void myMethod(MyEnum myEnumParam) {
// some logic here
}
}
通过反思调用SampleClass.myMethod(MyEnum.MY_SAMPLE_ENUM)
:
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);