java - 如何在运行时从类类型实例化一个类?

标签 java

考虑以下不太有效的尝试

public void createClass() {
    try {
        MyClass b = (MyClass)getMyClassType().newInstance();
    } catch(Exception e) {
        e.printStackTrace();
    }
 }

public Class<?> getMyClassType() {
    MyClass a = new MyClass(1);
    return a.getClass();
}


public class MyClass {
    private int k = 0;
    public MyClass(int t) {
        k = t;
    }

}

上面得到

Caused by: java.lang.NoSuchMethodException

我不太清楚为什么它不起作用。

本质上我希望能够从类类型创建类,最好是这样的

 Map<String, ClassType> a = new HashMap<>()

 a.get("myClassName").createClassInstanceFromClassType(constructorParam1);

上面的代码在java中可以实现吗?

最佳答案

Class.newInstance方法使用无参构造函数创建该类的新实例。然而,MyClass没有无参构造函数;它只有您提供的单参数构造函数。这就是为什么你得到 NoSuchMethodException 。另外,方法Class.newInstance自 Java 9 起已被弃用。

使用 getDeclaredConstructor method传入构造函数中期望查找的参数类型。然后你可以将参数作为newInstance的参数传递给构造函数。 .

MyClass b = (MyClass) getMyClassType().getDeclaredConstructor(int.class).newInstance(1);

此外,您可以更改 getMyClassType 的返回类型至Class<? extends MyClass> 。这允许您删除对 MyClass 的强制转换。如上所述。

关于java - 如何在运行时从类类型实例化一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53858293/

相关文章:

java - 使用 Jaxws 在 Soap Response 中添加额外的标签或元素

java - 从 PHP 生成和解码二维码

java - 如何用Java实现RSA加解密

java - Spring boot在添加mongo-java-driver maven依赖时尝试连接mongo

java - 如果我通过调用外部 API 获取流,是否应该关闭流?

java - 如何在android中以定义的间隔填充 ListView 中的文本字符串?

java - 如何在属性文件中将空字符串设置为 MYSQL 数据库的密码。

java - 如何在android中使用断言?

java - 正则表达式使用分隔符分割文本,但当分隔符位于 () 之间时不分割

java - 从 Web 服务响应中删除时区