如何在Java中通过类名获取类对象

49
我知道类名为"MyClass",想要获取该类的Class对象以便日后引用。有没有办法实现这一点?
我已经在网上查找过,但大多数相关内容都与ClassLoader相关,我认为那些方法不适合我的情况。我不想初始化一个类,只是想获取一个类对象以备将来使用。
编辑:关于第一个答案:
我已经检查了forName()方法,但我认为它也应该初始化该类。现在我可以使用完整参数调用它并将false传递给第二个参数,但第三个参数需要是null吗?
会吗?
Class.forName("MyClass", false, null);

返回MyClass.class

实际上,我想做的是用ID数组自动获取类对象来替换与Class对象相关联的字符串ID数组,以消除一些手动工作 :)

感谢快速回答,之前没有提到这一点很抱歉。

5个回答

71

你可以使用:

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

然后实例化一个对象:

Object obj = c.newInstance();

编辑:这只是最简单的用例。如评论所示,您需要考虑构造函数参数和初始化过程抛出的异常。 newInstance的JavaDocs中有所有细节。


Class.newInstance 会对异常做一些不好的事情。 - Tom Hawtin - tackline
1
是的。您需要处理任何初始化异常。 - Tony the Pony
3
为了使这个工作正常,这个类必须有一个可访问的无参构造函数。 - Jesper

8
Class.forName("MyClass")

阅读JavaDoc了解详细信息。


如果您不想初始化该类,则需要使用三个参数的形式。 - Tom Hawtin - tackline

3
值得注意的是,上述建议是正确的,但仅适用于默认(无参)构造函数。你也可以采取以下做法:
    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);
    }

如果其中一个参数是构造函数所需类型的子类或实现,则此方法将无法正常工作。 - ColinD

3

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接