首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用反射的动态对象创建和赋值

使用反射的动态对象创建和赋值
EN

Stack Overflow用户
提问于 2013-02-27 18:39:38
回答 4查看 2.4K关注 0票数 1

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

代码语言:javascript
运行
复制
Class classToLoad = Class.forName("com.somePackage.SomeotherPackage.classname" );

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

代码语言:javascript
运行
复制
Object obj = classToLoad.newInstance();

但问题在于,这样我就没有加载类的对象,而是得到对象类的对象。

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

代码语言:javascript
运行
复制
methodName.invoke(obj);

它抛出一个异常:

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

有人能帮忙吗?

有关问题的最新情况:

问题是,我需要分配的左边是一个不同的类类型,这个类类型将在运行时决定。

关于下列声明:

对象实例= clazz.newInstance();

“实例”应该是"clazz“类型,而不是"Object”类。

我怎样才能做到这一点?

EN

回答 4

Stack Overflow用户

发布于 2013-02-27 18:48:01

当所有设置都正确时,它可以正常工作:

代码语言:javascript
运行
复制
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中获取的。

票数 0
EN

Stack Overflow用户

发布于 2013-02-27 18:49:30

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

代码语言:javascript
运行
复制
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();
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-02-27 18:53:40

代码语言:javascript
运行
复制
java.lang.IllegalArgumentException: object is not an instance of declaring class

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15119725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档