黑马程序员技术交流社区
标题: 创建实例的三种方法 [打印本页]
作者: 云水禅心 时间: 2013-10-26 21:35
标题: 创建实例的三种方法
{:soso_e115:}创建实例对象的三种方式:
1、普通方式: Stringstr1 = new String("Hello");
2、反射构造方法: Stringstr2 = str1.getClass.getConstructor((StringBuilder.class).newInstance(newStringBuilder("Hello"));
3、Class.newInstance()方法:
Stringstr3 = String.class.newInstance();
第二种方法挺复杂的,还没有第一种方法简单,
但是为什么在开发中好些都用第二种方法呢?
第二种方法中代码这么长,分别都做了些什么,看了好多遍还是不理解,我都被弄晕了?
谢谢。
作者: Stephen_Chow 时间: 2013-10-26 22:14
明显第一种方法最最常用,你平常不都是new出来的实例吗
第二三种,用到了反射技术。而反射用在框架里,别的基本不用。
框架为什么用反射呢?举个例子:
假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。
这样就要用反射了,集下面的两种方法
作者: 起猿 时间: 2013-10-27 00:25
最常用的是第一种方法,java可以在运行时动态获取某个类的类信息,这就是java的反射。 而通过反射创建对象还有下面几种:
目前我所知道的有
1、通过Class对象的newInstance()方法,这种方法的局限是只能取调用默认的构造函数
2、通过取得Class对象的getConstructor方法取得Construtor对象,然后再通过调用Constructor类的newInstance的两个方法
3、通过Array.newInstance方法来创建对象,但这种只适用于数组,数组也是一种对象。
包括其他方法,每一种都没有明确的好坏,都是针对不同的功能来说的。
作者: 云水禅心 时间: 2013-10-27 08:19
谢谢各位帮我解决了疑惑。
作者: 麦子 时间: 2013-10-27 08:22
小例一枚,注释为解
import java.lang.reflect.*;//导入反射相关的类
/* 通过构造方法的反射调用创建一个String对象
* 程序分为编译时和运行时 编译时进行语法检查
* 运行时进行程序的操作
* Class类也有Class对象 这个对象就是本身
* 我们可以直接调用Class类newInstance产生一个Class类的实例
* 返回的是不带参数的默认构造方法,这个构造方法可以创建一个默认的实例对象
* 例如String str=(String)Class.forName("java.lang.String").newInstance() ;
*
*/
public class ConstructorReflectTest
{
public static void main(String[] args) throws Exception //抛出异常给JVM
{
Constructor con=String.class.getConstructor(StringBuffer.class) ; //通过String的Class对象返回带StringBuffer参数的构造方法对应的类
String str=(String)con.newInstance(new StringBuffer("abc")) ;//newInstance传递的参数要和构造器参数相对应
System.out.println(str.charAt(0)); //输出第一个字符
String ss=(String)Class.forName("java.lang.String").newInstance() ;//利用默认的构造方法进行构对象 这是Class类的方法
System.out.println(ss.getClass().getName()); //获得的类的名字
}
}
作者: 云水禅心 时间: 2013-10-27 08:35
早呀 麦子,送你一杯咖啡
仪表感谢。{:soso_e160:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |