将反射枚举传递给方法.invoke Java

3

如果您有一个通过反射访问的枚举类型,您如何将其值传递到方法.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));

我怀疑它 - 它不会编译。 - oxbow_lakes
正确,我之前没有尝试过,f.get() 是无效的,应该是 f.get(null)。纠正后,我的示例可以工作了。 - user150550
2个回答

5

您应该做以下操作:

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

由于您使用了原始类型,因此将会收到未经检查的警告,但这将编译并运行。

使用反射,您需要传递一个实例来访问Field - 但是在静态方法的情况下,您可以将null传递给Fieldget方法,如下所示:

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

此外,您调用myMethod方法时未创建实例,那么它是一个static方法吗?

他正在使用该字段尝试获取枚举值。使用您的代码,应该是 m.invoke(null, e) - ChssPly76
@ChssPly76 - 我认为你需要再读一遍我的答案。它没有任何问题。 - oxbow_lakes

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接