如何从Java中的类名获取类对象

时间:2009-09-17 12:03:07

标签: java reflection class

我知道班级名称,说“MyClass”,想要检索Class对象,即。 MyClass.class 以供将来参考。有没有办法做到这一点?

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

编辑:关于第一个答案:

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

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

返回MyClass.class

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

感谢您的快速回答,对不起之前没有提及。

5 个答案:

答案 0 :(得分:50)

您可以使用:

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

稍后实例化一个对象:

Object obj = c.newInstance();

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

答案 1 :(得分:7)

Class.forName("MyClass")

阅读the JavaDoc了解详情

答案 2 :(得分:3)

听起来您可以使用Class class的静态forName method

答案 3 :(得分:2)

值得注意的是,上述建议是正确的,但仅适用于默认(无参数)构造函数。你也可以这样做:

    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);
    }

答案 4 :(得分:0)

如果您不想指定完整的软件包名称,请致电:

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

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