代码之家  ›  专栏  ›  技术社区  ›  alkar

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

  •  31
  • alkar  · 技术社区  · 15 年前

    比如说,我知道这个班的名字 并且想要取回 Class 我的班级 供日后参考。有办法吗?

    我浏览过网络,但我发现大多数与之相关的东西都是关于 ClassLoader ,我想这不适合我的情况。我不想初始化一个类,只想得到一个类对象以备将来使用。

    我已经查过了 forName() 方法,但我认为它也应该初始化该类。现在我可以用完整的参数调用它并传递 false null 还是怎样

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

    回来 MyClass.class

    事实上,我想做的是替换与 对象,以及自动从中提取类对象的ID数组,以摆脱一些手动工作:)

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

    4 回复  |  直到 15 年前
        1
  •  68
  •   Tony the Pony    15 年前

    您可以使用:

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

    然后实例化一个对象:

    Object obj = c.newInstance();
    

    编辑:这只是最简单的用例。如注释所示,您需要考虑初始化过程引发的构造函数参数和异常。这个 JavaDocs for newInstance 有所有的细节。

        2
  •  8
  •   Joachim Sauer    15 年前
    Class.forName("MyClass")
    

    the JavaDoc 详情

        3
  •  3
  •   Thomas Owens    15 年前
        4
  •  2
  •   Droo    15 年前

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

        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
  •  0
  •   William H. Hooper    5 年前

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

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

    此语法允许您在移动时重新组织项目,或将此代码复制到另一个项目中 和它一起。幸亏 Joachim 谢谢你提醒我读文件!