将反射的枚举传递给method.invoke java

时间:2009-08-14 15:26:35

标签: java reflection enums methods invoke

如果您有通过反射访问的枚举,您将如何将其值传递给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));

2 个答案:

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