Ответ 1
Вам нужен экземпляр, а не класс:
TestMain object = // get TestMain object here
m1.invoke(object);
Или, если вы имеете в виду статический метод, поставьте null в качестве первого параметра:
m1.invoke(null);
Возможный дубликат:
Почему я получаю "объект не экземпляр объявления класса" при вызове метода с использованием отражения?
Когда я запускаю код ниже, почему он бросает эту ошибку?
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.Test.main(Test.java:10)
Здесь мой основной класс:
package com;
public class TestMain {
private String strName = "abcdefg...";
@SuppressWarnings("unused")
private void display(){
System.out.println(strName);
}
}
И мой тестовый класс:
package com;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
Class<TestMain> tm = null;
try{
tm= TestMain.class;
Method m1 =tm.getDeclaredMethod("display");
m1.setAccessible(true);
m1.invoke(tm);
}catch(Exception e){
e.printStackTrace();
}
}
}
Это мой модифицированный код, спасибо:
package com;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
TestMain tm =new TestMain();
try{
Method m1 = tm.getClass().getDeclaredMethod("display");
m1.setAccessible(true);
m1.invoke(tm);
}catch(Exception e){
e.printStackTrace();
}
}
}
Вам нужен экземпляр, а не класс:
TestMain object = // get TestMain object here
m1.invoke(object);
Или, если вы имеете в виду статический метод, поставьте null в качестве первого параметра:
m1.invoke(null);
m1
необходимо вызвать в экземпляре класса TestMain
, а не в самом классе (т.е. на объекте, созданном new TestMain()
).