Как вызвать метод класса Enum с помощью отражения - PullRequest
0 голосов
/ 21 июня 2019

Необходимо вызвать метод класса enum, который не имеет прямой зависимости при сборке. Я хочу вызвать метод класса enum, используя отражение с использованием Java.

Я тоже пытался использовать Поле, но не повезло

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 ]

1 голос
/ 21 июня 2019

Ваша ошибка - попытка преобразовать результат getMyEnum в String.getMyEnum возвращает 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 on.

0 голосов
/ 21 июня 2019

Для вызова Method.invoke в качестве первого параметра требуется объект типа, из которого метод получен.Вместо этого вы передаете Field (во втором вызове).

Если вы хотите получить конкретное перечисление по его имени, вы можете использовать метод valueOf и передать его в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...