如何将类转换为实例对象

问题描述 投票:0回答:4

看看我的代码......

    Class<?> c = Class.forName("PerformanceInvokeService");

    Method m = c.getDeclaredMethod("monthlyTestCal", new Class[] {
            String.class, Date.class });
    Object ret = m.invoke("PerformanceInvokeService", new Object[] {
            "some string", new Date() });
    System.out.println(ret);

我执行这个并抛出异常

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

我想,因为我没有创建 c 的实例(喜欢...new PerformanceInvokeService()) 我不知道如何创建它

有人帮忙吗?

对不起我的英语...

谢谢

java reflection
4个回答
3
投票

如果

PerformanceInvokeService
有一个可访问的默认构造函数,您可以使用以下方法创建一个新实例:

Object instance = c.newInstance();

然后您可以将其传递给方法调用:

Object ret = m.invoke(instance, new Object[] { "some string", new Date() });

如果没有可访问的默认构造函数,那么您必须找到一个可以通过反射来使用的构造函数。


1
投票

Class
有一个
newInstance()
方法,您可以调用该方法来使用其默认构造函数创建该类的实例。或者,您可以调用
getConstructor()
getConstructors()
来查找采用正确类型参数的构造函数,然后在
newInstance()
对象上调用
Constructor
,传递构造参数。


1
投票

您需要添加

Object myInstance = c.newInstance();

这将调用默认构造函数并创建一个新对象。然后你可以使用它作为

中的第一个参数
m.invoke()

0
投票

在较新版本的 Java 上尝试以下操作:

  • 假设
    resultClass
    代表
    Class<T> resultClass
  • 这样做的原因是
    Class.newInstance
    现已弃用(自 Java 9 起)
try {
  content.add(resultClass.getDeclaredConstructor().newInstance());
} catch (Exception e) {
  log.catching(e);
}

附注也许用

Exception
来捕捉有点过分了。

© www.soinside.com 2019 - 2024. All rights reserved.