如何使用反射在Enum类上调用方法

时间:2019-06-21 07:01:09

标签: java reflection

需要在枚举类上调用该方法,我没有直接的构建依赖性。我想使用Java的反射在enum类上调用该方法。

我也尝试过使用Field,但没有运气

class myClass
{
  public void validateObjectType(Object obj)
  {
    Class<?> cls = Class.forName("package1.myEnum");
    Class [] parameterTypes = {Object.class};
    Method method = cls.getDeclaredMethod("getMyEnum", parameterTypes );
    String enumType = (String)method.invoke(null, new Object[]{obj1}); 

    Field enumTypeField = cls.getField(enumType );

   // -- invoke method getLocalName() on the object of the enum class.??
   Class [] parameters = {String.class};
            Method method1= cls.getDeclaredMethod("getLocalName", parameters);

String localizedName = (String) method1.invoke(enumTypeField , new Object[] {enumType});

  }

}

但是我在

遇到错误
method1.invoke(enumTypeField , new Object[] {}) // 

错误:

java.lang.IllegalArgumentException: object is not an instance of declaring class

套餐1:

class enum myEnum
{

  A, 
  B;

 public static myEnum getMyEnum(Object a)
 {
   // business logic.
   // -- based on the type of object decide MyEnum
   if (null != object) return B;
   else  return A ;
 }

 public String getLocalName(String value)
 {
   if (value.equal(A.toString) return "my A";
   else if(value.equal(B.toString) return "my B";   
 }

}

套餐2:

//-在这里我没有依赖包1。 //--不想添加,因为它会导致循环依赖

class myClass
{

  public void validateObjectType(Object obj)
  {
    Class<?> cls = Class.forName("package1.myEnum");
    Class [] parameterTypes = {Object.class};
    Method method = cls.getDeclaredMethod("getMyEnum", parameterTypes );
    ?? = (??)method.invoke(null, new Object[] {obj1}); // will get the Enum but dont have acces

   // -- invoke method getLocalName() on the object of the enum class.??
  }

}

2 个答案:

答案 0 :(得分:1)

您的错误是试图将getMyEnum的结果转换为StringgetMyEnum返回myEnum,因此您不应将其转换为String。只需将其保留为Object

Class<?> cls = Class.forName("package1.myEnum");
Class [] parameterTypes = {Object.class};
Method method = cls.getDeclaredMethod("getMyEnum", parameterTypes);
Object enumValue = method.invoke(null, obj);

由于您说过getLocalName实际上不接受任何参数,因此您只需获取方法并按如下方式调用它即可:

Method method1= cls.getDeclaredMethod("getLocalName");

String localizedName = (String) method1.invoke(enumValue); // <-- using enumValue here!
System.out.println(localizedName);

您不需要enumTypeField变量,因为enumValue已经是我们要调用getLocalName的枚举值。

答案 1 :(得分:0)

Method.invoke调用需要一个方法类型来自的对象作为第一个参数。您正在传递Field(在第二次通话中)。

如果要通过名称获取特定的枚举,则可以使用valueOf方法并将其传递。