【问题标题】:Java how to instantiate a class from string [duplicate]Java如何从字符串实例化一个类[重复]
【发布时间】:2011-09-21 07:03:11
【问题描述】:

可能重复:
Create new class from a Variable in Java

我有一个字符串

String className = "DummyClass"

现在我想创建一个类名为 className 的类对象,类似于

Object className = new className() // I know it's not possible.

我想知道怎么做...

【问题讨论】:

    标签: java jakarta-ee


    【解决方案1】:

    "Using java.lang.reflect" 将回答您的所有问题。首先使用Class.forName()获取Class对象,然后:

    如果我想实例化一个我用forName() 检索的类,我必须首先向它请求一个代表我想要的构造函数的java.lang.reflect.Constructor 对象,然后请求Constructor 创建一个新对象。 Class 中的方法 getConstructor(Class[] parameterTypes) 将检索到 Constructor;然后我可以通过调用它的方法newInstance(Object[] parameters)来使用Constructor

    Class myClass = Class.forName("MyClass");
    
    Class[] types = {Double.TYPE, this.getClass()};
    Constructor constructor = myClass.getConstructor(types);
    
    Object[] parameters = {new Double(0), this};
    Object instanceOfMyClass = constructor.newInstance(parameters);
    

    Class 上的 newInstance() 方法似乎可以满足您的要求。 不要使用它。它以静默方式将已检查的异常转换为未检查的异常。

    请注意,此方法会传播由 nullary 构造函数引发的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译器执行的编译时异常检查。 Constructor.newInstance 方法通过将构造函数抛出的任何异常包装在(已检查)InvocationTargetException 中来避免此问题。

    【讨论】:

    • 由于java 1.5,constructor.newInstance() 是可变参数,所以constructor.newInstance(new Double(0), this); 可以(而不是使用繁琐的Object[] 方式)。 Class.getConstructor() 也是如此(不需要丑陋的 Class[])
    • 如果类是静态的怎么办?你不需要构造函数吧?
    • @advocate,static 类只是一个内部类,它没有对其包含类的实例的隐式引用。它仍然需要有一个构造函数。
    • @advocate,如果您尝试调用静态方法,那么您不需要构造函数,但您想这样调用 invoke:Object returnValue = listMethod.invoke(null, argument0, argument1, argument2);。您将null 作为this 的值传入,因为静态方法不在类实例的上下文中运行。
    • @advocate,是的。 invoke 方法是 variadic,因此您可以传递任意数量的参数。
    【解决方案2】:

    您可以使用reflection。例如,

    Object o = Class.forName(className).newInstance(); 
    

    className 应该包含类的完整路径。

    【讨论】:

    • 不要使用Class.newInstancejavadoc 明确表示“使用此方法有效地绕过编译时异常检查,否则编译器将执行该检查。Constructor.newInstance 方法通过将构造函数抛出的任何异常包装在(已检查)@ 中来避免此问题。 987654327@。”
    • @limirus,是的。它深深地埋在 javadoc 中。
    【解决方案3】:

    查看此问题的答案:What is the difference between "Class.forName()" and "Class.forName().newInstance()"?,其中详细解释了这一切的工作原理。

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 2018-08-09
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多