【问题标题】:dynamic object creation and assignment using reflection使用反射的动态对象创建和分配
【发布时间】:2013-02-13 17:03:25
【问题描述】:

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

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”类。

我怎样才能做到这一点?

【问题讨论】:

  • 好吧,听起来你的方法不对。请展示一个简短但完整的示例。
  • classToLoad.newInstance(); 返回类“已存储”int classToLoad 的新实例。您可以通过打印obj.getClass() 来检查它,因此您的问题必须隐藏在其他地方。正如 Jon 建议的那样,您应该向我们展示一些我们可以用来重现您的错误的代码,否则我们只能猜测可能出了什么问题。
  • 你想要做的通常是通过定义一个抽象方法的抽象父类来解决,你可以将它用于所有子类的接口:AbstractParentClass obj = (AbstractParentClass) classToLoad.newInstance();

标签: java object reflection instance variable-assignment


【解决方案1】:

一切设置正确后就可以正常工作了:

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 获取的。

【讨论】:

    【解决方案2】:

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

    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();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:
      java.lang.IllegalArgumentException: object is not an instance of declaring class
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-02
          • 1970-01-01
          • 1970-01-01
          • 2016-11-14
          • 1970-01-01
          • 2010-11-12
          相关资源
          最近更新 更多