问题描述
- java Class.newInstance()方法的作用
-
我在项目里面看到有这样一段代码:
Class clazz = Class.forName(className);
Object obj = clazz.newInstance();
第一句我在百度搜到答案懂了,但第二句的newInstance方法的作用我没找到答案,有哪位大神能教下吗?谢谢。
解决方案
用反射的方式创建一个对象的实例。相当于new。不过new需要知道类型。
解决方案二:
首先我要叨叨一句为什么不去查javadoc而去查百度,javadoc里有非常准确的定义
Creates a new instance of the class represented by this Class object. The class is instantiated as if by a new expression with an empty argument list. The class is initialized if it has not already been initialized.
简单说就是实例化这个类,她实际上是使用了没有参数的构造函数,而且他会初始化这个对象如果这个还没有初始化过。(有些静态变量在类初始化的时候要进行初始化)
另外再叨叨一句,这个api只会调用缺省的构造函数,如果你需要使用带参数的构造函数,你应该使用clazz.getConstructor().newInstance(...).
还有caozhy说new要知道类型,其实在做newInstance的时候,类型是知道的。当然这里还和普通的new有区别的是,但构造函数是private的时候,你没有在其他类直接调用这个构造函数,因为编译不会通过。但是假设没有securitymanager,clazz.newInstance可以调用成功。但是clazz.getConstructor().newInstance()会检查这个编译异常,
public class NewMain {
private NewMain() {
}
public static void main(String[] args) throws Exception {
Class<NewMain> c = NewMain.class;
NewMain nm = c.newInstance();
NewMain nm1 = c.getConstructor().newInstance();
}
}
解决方案三:
楼上都回答完了,用反射的方法创建一个类的实例。
至于为什么这么做,一般是为了通过动态创建的方式增加系统的可扩展性。比如,通过配置文件指定运行时使用哪个实现。比如可以用这个办法来实现插件。
解决方案四:
感谢大家回答小弟的问题,现在我有还有个问题一直堵在心里……
就是Class的加载不是分为3步(1、加载,2、连接,3、初始化)吗?那class.getName()已经初始化了,class.newInstance()就是实例化?这个时候才会在内存中分配内存?
小弟有好多东西不懂,希望各位理解。
解决方案五:
感谢大家回答小弟的问题,现在我有还有个问题一直堵在心里……
就是Class的加载不是分为3步(1、加载,2、连接,3、初始化)吗?那class.getName()已经初始化了,class.newInstance()就是实例化?这个时候才会在内存中分配内存?
小弟有好多东西不懂,希望各位理解。