1

我正在加载一个带有以下语句的类:

Class classToLoad = Class.forName("com.somePackage.SomeotherPackage.classname" );

后来我使用反射来获取这个类的方法。现在要使用 methodname.invoke() 函数调用方法,我需要加载类的对象。因此我想创建加载类的对象。我尝试这样做:

Object obj = classToLoad.newInstance();

但问题是这样我没有加载类的对象,但我得到了 Object 类的对象。

现在,如果我想调用加载类的函数,我会这样做:

methodName.invoke(obj);

它抛出一个异常:

java.lang.IllegalArgumentException:对象不是声明类的实例

有人可以帮忙吗?

问题更新:

问题是我需要分配的左侧是不同的类类型,并且该类类型将在运行时决定

对于以下声明:

对象实例 = clazz.newInstance();

“instance”应该是“clazz”类型而不是“Object”类。

我怎样才能做到这一点?

4

4 回答 4

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

如果该方法没有参数并且在您的对象的类中找不到,则可以抛出此错误。可能您在错误的对象上调用调用方法,或者您获取的方法对于您的对象是错误的。

于 2013-02-27T18:53:40.930 回答
0

问题是我需要分配的左侧是不同的类类型,并且该类类型将在运行时决定。...我怎样才能做到这一点?

使用 Java 以外的其他语言。Java 是静态类型的,这基本上意味着您不能完全按照您刚刚询问的方式去做。此处的其他答案正确显示了如何在编译时不知道对象类型的情况下调用方法,但是您永远无法在运行时设置变量的类型。

于 2013-02-28T04:11:27.437 回答
0

当一切设置正确时,它工作正常:

import java.lang.reflect.Method;

class Foo {

    public Foo() {
    }

    public void sayHello() {
        System.out.println("Hello");
    }
}

public class Test {    

    public static void main (String[] args) throws Exception {
        Class<?> clazz = Class.forName("Foo");
        Method method = clazz.getMethod("sayHello");
        Object instance = clazz.newInstance();

        method.invoke(instance); // Prints Hello
    }
}

我的猜测是您获取的方法 ( methodName) 实际上并没有从classToLoad.

于 2013-02-27T18:48:01.923 回答
0

您也可以只转换返回类型并直接调用该方法。

public class Foo{
    void HelloReflection(){
        System.out.println("Hello reflection");
    }
    public static void main(String[] args){
        try{
            Foo o = (Foo) Class.forName("Foo").newInstance();
            o.HelloReflection();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
于 2013-02-27T18:49:30.683 回答