【问题标题】:How to get a Class Object from the Class Name in Java如何从 Java 中的类名中获取类对象
【发布时间】:2009-09-17 12:03:06
【问题描述】:

我知道类名,例如 "MyClass" 并想检索 Class 对象,即。 MyClass.class 供将来参考。有没有办法做到这一点?

我浏览了网络,但我发现与它相关的大部分内容都是关于 ClassLoader,我认为它不适合我的情况。我不想初始化一个类,只想获取一个类对象以备将来使用。

编辑:关于这个的第一个答案:

我已经检查了forName() 方法,但我认为这也应该初始化类。现在我可以用完整的参数调用它并将false 传递给第二个参数,但是第三个必须是null 还是什么?

Class.forName("MyClass", false, null);

返回MyClass.class?

事实上,我想要做的是将与Class对象关联的字符串ID数组替换为自动从中获取类对象的ID数组,以摆脱一些手动工作:)

感谢您的快速回答,抱歉之前没有提及。

【问题讨论】:

    标签: java reflection class


    【解决方案1】:

    你可以使用:

    Class c = Class.forName("com.package.MyClass");
    

    然后实例化一个对象:

    Object obj = c.newInstance();
    

    编辑:这只是最简单的用例。如 cmets 中所示,您将需要考虑初始化过程引发的构造函数参数和异常。 JavaDocs for newInstance 包含所有详细信息。

    【讨论】:

    • Class.newInstance 做坏事但有例外。
    • 是的。您将需要处理任何初始化异常。
    • 为此,该类必须具有可访问的无参数构造函数。
    【解决方案2】:
    Class.forName("MyClass")
    

    阅读the JavaDoc了解详情

    【讨论】:

    • 如果不想初始化类,则需要三参数形式。
    【解决方案3】:

    听起来你也许可以使用Class class的静态forName method

    【讨论】:

      【解决方案4】:

      还值得注意的是,上述建议是正确的,但仅适用于默认(无参数)构造函数。您还可以执行以下操作:

          public Object newInstance(String className, Object...args) throws Exception {
              Class<?> clazz = Class.forName(className);
              if(args == null || args.length == 0) {
                  return clazz.newInstance();
              }
      
              List<Class<?>> argTypes = new ArrayList<Class<?>>();
              for(Object object : args) {
                  argTypes.add(object.getClass());
              }
              Constructor<?> explicitConstructor = clazz.getConstructor(argTypes.toArray(new Class[argTypes.size()]));
              return explicitConstructor.newInstance(args);
          }
      

      【讨论】:

      • 如果参数之一是构造函数想要的类型的子类或实现,这将不起作用。
      【解决方案5】:

      如果您不想指定完整的包名,请调用:

      Class.forName("MyClass", true, this.getClass().getClassLoader());
      

      此语法允许您重新组织项目,或将此代码复制到另一个项目中,只要您将 MyClass 与它一起移动即可。感谢Joachim 提醒我阅读文档!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-24
        • 2015-02-16
        • 2011-04-08
        • 1970-01-01
        • 2014-10-09
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        相关资源
        最近更新 更多