动态对象创建和使用反射分配

时间:2013-02-27 18:39:38

标签: java object reflection instance variable-assignment

我正在使用以下语句加载一个类:

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

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

Object obj = classToLoad.newInstance();

但问题在于这种方式我没有得到类的对象加载,但我得到了Object类的对象。

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

methodName.invoke(obj);

它引发了异常:

  

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

任何人都可以帮忙吗?

问题更新:

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

以下声明:

Object instance = clazz.newInstance();

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

我怎样才能实现这个目标?

4 个答案:

答案 0 :(得分: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获取。

答案 1 :(得分: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();
        }
    }
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

  

问题是我需要赋值的左侧是不同的类类型,并且类型类型将在运行时决定。 ......我怎么能实现这个目标?

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