методы вызова java-отражения уже загруженного объекта - PullRequest
4 голосов
/ 11 сентября 2010

Как я могу вызвать метод объекта, который уже был загружен в JVM с помощью отражения? Я пытался

Class myClass = Class.forName("myClass");
Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {});
Object result = m.invoke(myClass,null);

но я получаю java.lang.IllegalArgumentException: объект не является экземпляром объявления класса . Метод, который я хочу вызвать, является недействительным, т. Е. Не принимает параметры

UPDATE У меня есть приложение, которое уже загрузило класс "A". Еще один класс "B" будет создан в рамках. Когда класс "B" инициализирован, класс "A" уже загружен в JVM. Я хочу вызвать метод из загруженного экземпляра класса "A", НО без ссылки на "A" в классе "B". В ответах кажется, что я должен создать новый экземпляр «A» в классе «B», но я хочу получить доступ к уже загруженному объекту. Если я создаю новый экземпляр «A» в «B», зачем мне использовать отражение? Я что-то неправильно понимаю?

Спасибо

Ответы [ 6 ]

11 голосов
/ 11 сентября 2010

Вы передаете экземпляр Class в качестве первого параметра Method.invoke(..), но это неправильно; Вы хотите передать интересующий вас экземпляр.

result = m.invoke(myInstance, null);
4 голосов
/ 11 сентября 2010

Я думаю, вам нужно

Class myClass = myObject.GetClass();
Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {});
Object result = m.invoke(myObject,null);
2 голосов
/ 11 сентября 2010

Вместо:

Object result = m.invoke(myClass, null);

Вы должны передать экземпляр myClass.Недопустимое исключение аргумента связано с вызовом получения аргумента типа Class вместо типа myClass:

Object result = m.invoke(myInstance, null);
1 голос
/ 26 июля 2012

Если у меня есть ссылка на объект, зачем мне использовать отражение?Я хочу вызвать метод объекта, который уже загружен в JVM из другого объекта без ссылки на него.

Конечно, вам нужна ссылка для вызова метода, вы можете использовать его следующим образом:

Object result = m.invoke(myClass.newInstance(),null);

Но срок жизни экземпляра имеет значение в зависимости от того, как вы его создаете (обычно илиотражением).

0 голосов
/ 16 декабря 2014

У меня та же проблема, и для тех, кто ее знает, очень просто, если вы находитесь в том же месте, куда хотите позвонить, сделайте:

Object result = m.invoke(this, null);

с это вы передадите экземпляр селфи и не потеряете свои значения.

0 голосов
/ 11 сентября 2010

Особенность invoke в том, что вам не нужно иметь точный экземпляр рассматриваемого класса, если вызываемый метод не требует каких-либо переменных экземпляра родительского класса.Фактически, вы можете добавить модификатор static к Method и просто вызвать invoke с помощью null, null, Object[], что совпадает с:

public void methLab(Method m){
  try{
    m.invoke(m.getDeclaringClass().newInstance(), new Object[0]);
  }catch(IllegalAccessException iae){
   // The method or parent class is declared private or protected
  }catch(IllegalArgumentException iae){
   // unsatisfied input parameters ( in this case, no params were passed) 
  }catch(InstantiationException ie){
   // could be several things  
  }catch(InvocationTargetException it){
   // Method specific, exception chain. call: it.getTargetException().
  }
}
...