【问题标题】:How to instantiated a class from class type at run time?如何在运行时从类类型实例化一个类?
【发布时间】:2019-05-20 08:41:42
【问题描述】:

考虑以下不太奏效的尝试

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中是否可行?

【问题讨论】:

标签: java


【解决方案1】:

Class.newInstance 方法使用无参数构造函数创建类的新实例。但是,MyClass 没有无参数构造函数;它只有你给它的单参数构造函数。这就是你得到NoSuchMethodException 的原因。此外,Class.newInstance 方法自 Java 9 起已被弃用。

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

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

另外,您可以将getMyClassType 的返回类型更改为Class&lt;? extends MyClass&gt;。这使您可以删除上述MyClass 的演员表。

【讨论】:

    【解决方案2】:

    你要找的东西,叫做构造函数。

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

    您正在尝试做的事情,很容易通过使用 new 关键字来实现。

    就其本质而言,这就是您想要的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多