java Class.newInstance()方法的作用

我在项目里面看到有这样一段代码:
Class clazz = Class.forName(className);
Object obj = clazz.newInstance();
第一句我在百度搜到答案懂了,但第二句的newInstance方法的作用我没找到答案,有哪位大神能教下吗?谢谢。

5个回答

首先我要叨叨一句为什么不去查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(); 
}

}

ly3227116
ly3227116 回复eagleyan: 没,做了一年了,但是之前都没关注过这个问题……
接近 6 年之前 回复
eagleyan
Coursera 这是两回事,首先你得明白什么是反射,一般我们的程序都是编译器决定类型的。但是反射让你可以通过名字在运行期决定类型。不过我看了一下,觉得你的程度真的是比较低。你还在读大学么?
接近 6 年之前 回复
ly3227116
ly3227116 Hi Coursera,你说在做newInstance的时候,类型是知道的,意思是任何对象的new都经过了newInstance?
接近 6 年之前 回复

用反射的方式创建一个对象的实例。相当于new。不过new需要知道类型。

楼上都回答完了,用反射的方法创建一个类的实例。

至于为什么这么做,一般是为了通过动态创建的方式增加系统的可扩展性。比如,通过配置文件指定运行时使用哪个实现。比如可以用这个办法来实现插件。

感谢大家回答小弟的问题,现在我有还有个问题一直堵在心里……
就是Class的加载不是分为3步(1、加载,2、连接,3、初始化)吗?那class.getName()已经初始化了,class.newInstance()就是实例化?这个时候才会在内存中分配内存?
小弟有好多东西不懂,希望各位理解。

加载是加载。class字节码,链接是分配静态域,初始化是初始化静态域的成员和方法

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐