Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中如何从类名中获取类对象_Java_Reflection_Class - Fatal编程技术网

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

Java中如何从类名中获取类对象,java,reflection,class,Java,Reflection,Class,我知道类名,比如说“MyClass”,并希望检索类对象,即MyClass.class,以备将来参考。有办法吗 我浏览过网络,但我发现与之相关的大部分内容都是关于类加载器的,我认为这不适合我的情况。我不想初始化一个类,只想得到一个类对象以备将来使用 编辑:关于此问题的第一个答案: 我已经检查了forName()方法,但我认为该方法也应该初始化该类。现在我可以用完整参数调用它,并将false传递给第二个参数,但是第三个参数必须是null还是什么 会 returnMyClass.class 事实上,我

我知道类名,比如说“MyClass”,并希望检索
对象,即MyClass.class,以备将来参考。有办法吗

我浏览过网络,但我发现与之相关的大部分内容都是关于
类加载器的,我认为这不适合我的情况。我不想初始化一个类,只想得到一个类对象以备将来使用

编辑:关于此问题的第一个答案:

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

return
MyClass.class

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

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

Class.forName("MyClass")

有关详细信息,请阅读。

听起来您可能可以使用的静态。

您可以使用:

Class c = Class.forName("com.package.MyClass");
然后实例化一个对象:

Object obj = c.newInstance();

编辑:这只是最简单的用例。如注释所示,您需要考虑初始化过程引发的构造函数参数和异常。还有一点值得注意,上面的建议是正确的,但只适用于默认(无参数)构造函数。您还可以执行以下操作:

    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);
    }
public Object newInstance(字符串className,Object…args)引发异常{
Class clazz=Class.forName(className);
if(args==null | | args.length==0){
返回clazz.newInstance();
}
列表>();
用于(对象:args){
argTypes.add(object.getClass());
}
构造函数explicitConstructor=clazz.getConstructor(argTypes.toArray(新类[argTypes.size()]);
返回explicitConstructor.newInstance(args);
}

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

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

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

如果不想初始化该类,则需要使用三个参数form.class.newInstance来处理异常。是的。您将需要处理任何初始化异常。要使其正常工作,该类必须具有可访问的无参数构造函数。如果其中一个参数是构造函数所需类型的子类或实现,则此操作将不起作用。
Class.forName("MyClass", true, this.getClass().getClassLoader());