我知道班级名称,说“MyClass”,想要检索Class
对象,即。 MyClass.class 以供将来参考。有没有办法做到这一点?
我浏览了网页,但我发现与之相关的大部分内容都与ClassLoader
有关,我认为这不适合我的情况。我不想初始化一个类,但只获取一个类对象以供将来使用。
编辑:关于第一个答案:
我已经检查了forName()
方法,但我认为这也应该初始化类。现在我可以用完整的参数调用它并将false
传递给第二个参数,但是第三个参数必须是null
还是什么?
将
Class.forName("MyClass", false, null);
返回MyClass.class
?
实际上,我想要做的是替换与Class
对象关联的字符串ID数组,以及从中自动获取类对象的ID数组,以省去一些手动工作: )
感谢您的快速回答,对不起之前没有提及。
答案 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提醒我阅读文档!