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

时间:2018-12-19 19:52:29

标签: 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中以上可能吗?

2 个答案:

答案 0 :(得分:2)

Class.newInstance方法使用无参数构造函数创建该类的新实例。但是,MyClass没有无参数的构造函数。它只有您给它的一个参数的构造函数。这就是为什么您得到NoSuchMethodException的原因。此外,自Java 9开始不推荐使用方法Class.newInstance

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

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

此外,您可以将getMyClassType的返回类型更改为Class<? extends MyClass>。这使您可以删除上面MyClass的演员表。

答案 1 :(得分:1)

您要寻找的被称为构造函数。

如果一个类没有声明构造函数,那么JVM将为您隐式创建一个构造函数。

您要尝试执行的操作非常简单,只需使用new关键字即可实现。

从本质上讲,这就是您想要的:

class MyClass{

    MyClass(){
     //your implementation
    }
}



class AnotherClass{
    public static void main(String[] args){
        MyClass myClass = new MyClass();
    }
}