newinstance-java Class.newInstance()方法的作用

问题描述

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()就是实例化?这个时候才会在内存中分配内存?
小弟有好多东西不懂,希望各位理解。

时间: 2024-09-14 05:58:56

newinstance-java Class.newInstance()方法的作用的相关文章

JAVA中toString方法的作用

以下是对在JAVA中toString方法的作用进行了详细的分析介绍,需要的朋友可以参考下   因为它是Object里面已经有了的方法,而所有类都是继承Object,所以"所有对象都有这个方法". 它通常只是为了方便输出,比如System.out.println(xx),括号里面的"xx"如果不是String类型的话,就自动调用xx的toString()方法 总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法  回答补充:写这个

浅析JAVA中toString方法的作用_java

因为它是Object里面已经有了的方法,而所有类都是继承Object,所以"所有对象都有这个方法". 它通常只是为了方便输出,比如System.out.println(xx),括号里面的"xx"如果不是String类型的话,就自动调用xx的toString()方法 总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法 回答补充:写这个方法的用途就是为了方便操作,所以在文件操作里面可用可不用例子1: 复制代码 代码如下: publ

方法-求问:java里面static修饰符作用

问题描述 求问:java里面static修饰符作用 static作用具体是什么,非static作用又是什么,static修饰方法和属性分别是什么效果,具体点谢谢 解决方案 static 是全局变量, 如 static int c=0; c=c+1; 那么这变量,就是一个全局变量, 每一次改变它都会执行,但是再给它赋值 就会报错 再这样写 c=5; 系统就会报错. 解决方案二: static修饰的成员变量或者成员函数,是直接通过类名来访问的,不需要实例化的. 而非静态的成员方法的访问需要通过实例化

java,main方法中可以运行,为啥被调用时不起作用,

问题描述 java,main方法中可以运行,为啥被调用时不起作用, public class Test { // public static void main(String[] args){ public static void sendMail(){ //这个类主要是设置邮件 MailSenderInfo mailInfo = new MailSenderInfo(); .............. 之前用main方法运行时,(就是鼠标右键运行那种),是可以的, 为啥把方法换成sendMai

java-求助,Java中对象序列化的作用是什么?

问题描述 求助,Java中对象序列化的作用是什么? Java中对象序列化的作用是什么?求大神相助,希望能全面一点哦.急求大神解答 解决方案 简单来说,对象像一颗树,里面有字段,如果字段是类型,那么它还有自己的字段. 但是网络传输.保存文件,都必须是线性的,连续的. 序列化就是把这棵树拍扁,成为一个序列的过程. 反序列化就是从一个序列中重新把这颗树拉回来的过程. 解决方案二: 把一个对象,转成流数据,对方根据这个数据还原成初始对象,适用于不同对象间的传输,通讯 解决方案三: 序列化多用于网络IO通

java访问private方法求解

问题描述 java访问private方法求解 java里如何从一个类访问另一个类的private方法 求解,就是成员变量我都知道怎么办,方法不懂 解决方案 如果是内部类,可以访问,外部类,就不行了,你还是老老实实遵守面向对象的规则吧 解决方案二: 可以用反射,但是尽量不要破坏规则,别人用private,是有别人自己的用意的. 解决方案三: Java private方法访问 解决方案四: 既然是私有的当然无法访问 把它改成public就可以啊 解决方案五: 利用反射的原理就对私有的属性进行访问.如

java反射拼接方法名动态执行方法实例_java

近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的.但是每个code确实对应一个方法的. code的值有很多个,自己又不想做ifelse或者switch判断于是就狂搜资料,主要让我发现利用java的反射机制可以完美的解决这个问题 测试代码如下:(可以携带多个参数哦) package com.escs.xmlutils; import java.lang.reflect.Method; public class Test { public

java实现Spring在XML配置java类的方法_java

1. 创建自己的bean文件:beans.xml <?xml version="1.0" encoding="UTF-8"?> <busi-beans> <beans> <bean id="SysHelloImpl" type="com.cxm.test.SysHello"> <desc>test</desc> <impl-class>com.

java调用固有方法

我们先从一个简单的例子开始:一个Java程序调用固有方法,后者再调用Win32的API函数MessageBox(),显示出一个图形化的文本框.这个例子稍后也会与J/Direct一志使用.若您的平台不是Win32,只需将包含了下述内容的C头: #include <windows.h> 替换成: #include <stdio.h> 并将对MessageBox()的调用换成调用printf()即可. 第一步是写出对固有方法及它的自变量进行声明的Java代码:   class ShowM