什么导致了“object is not an instance of declaring class”错误?

16

可能重复:
为什么使用反射调用方法时会抛出“对象不是声明类的实例”的错误?

当我运行以下代码时,为什么会抛出这个错误?

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();
            }
        }
    }
2个回答

23

你需要一个实例,而不是类:

TestMain object = // get TestMain object here
m1.invoke(object);

或者如果你指的是静态方法,将第一个参数设置为null:

m1.invoke(null);

1

m1 需要在 TestMain 类的实例上调用,而不是在类本身上调用(即在由 new TestMain() 创建的对象上调用)。


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