A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

         1. 要说他两的区别,首先要知道在什么情况下会用到他两,当使用反射时会出现他两,使用反射的时候要知道什么叫反射。
反射介绍
     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
        对于任意一个对象,都能够调用它的任意一个方法
        这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制.
        简单来说, 就可以把.class文件比做动物的尸体, 而反射技术就是对尸体的一种解剖.

   通过反射技术, 我们可以拿到该字节码文件中所有的东西, 例如成员变量, 成员方法, 构造方法, 而且还包括私有
代码如下:
                //获取Student类字节码对象
                Class clazz = Class.forName("com.itheima_01.Student");
               
                //通过公共的空参的构造方法创建对象
                Object obj = clazz.newInstance();
                System.out.println(obj);
               
                //获取公共的空参的构造方法
                Constructor c = clazz.getConstructor();
                Object obj = c.newInstance();
                System.out.println(obj);
               
                //获取私有的有参构造方法
                Constructor c2 = clazz.getDeclaredConstructor(String.class,int.class);
                //去除私有权限
                c2.setAccessible(true);
                //创建对象
                Object obj = c2.newInstance("李四",24);
                System.out.println(obj);
       通过上面代码可以知道getConstructor和newInstance的区别其实主要就是newInstance只能调用空参的构造方法,而且必须要有空参构造才行。
    2.newInstance和new都可以创建对象,他们两有什么区别呢?
   1、类的加载方式不同
      在执行Class.forName("a.class.Name")时,JVM会在classapth中去找对应的类并加载,这时JVM会执行该类的静态代码段。在使用newInstance()方法的时候,必须保证这个类已经加载并且已经连接了,而这可以通过Class的静态方法forName()来完成的。
     使用关键字new创建一个类的时候,这个类可以没有被加载,一般也不需要该类在classpath中设定,但可能需要通过classlaoder来加载。
   2、所调用的构造方法不尽相同
     new关键字能调用任何构造方法。
     newInstance()只能调用无参构造方法。
   3、执行效率不同
     new关键字是强类型的,效率相对较高。
     newInstance()是弱类型的,效率相对较低。
     既然使用newInstance()构造对象的地方通过new关键字也可以创建对象,为什么又会使用newInstance()来创建对象呢?
     假设定义了一个接口Door,开始的时候是用木门的,定义为一个类WoodenDoor,在程序里就要这样写 Door door = new WoodenDoor() 。假设后来生活条件提高,换为自动门了,定义一个类AutoDoor,这时程序就要改写为 Door door = new AutoDoor() 。虽然只是改个标识符,如果这样的语句特别多,改动还是挺大的。于是出现了工厂模式,所有Door的实例都由DoorFactory提供,这时换一种门的时候,只需要把工厂的生产模式改一下,还是要改一点代码。
    而如果使用newInstance(),则可以在不改变代码的情况下,换为另外一种Door。具体方法是把Door的具体实现类的类名放到配置文件中,通过newInstance()生成实例。这样,改变另外一种Door的时候,只改配置文件就可以了。示例代码如下:
String className = 从配置文件读取Door的具体实现类的类名;
Door door = (Door) Class.forName(className).newInstance();
    再配合依赖注入的方法,就提高了软件的可伸缩性、可扩展性。

25 个回复

倒序浏览
牛逼牛逼
回复 使用道具 举报
支持下楼主
回复 使用道具 举报

谢谢哈
回复 使用道具 举报

低调低调
回复 使用道具 举报
回复 使用道具 举报
感觉回到了班级中午演讲的时候了
回复 使用道具 举报
厉害了
回复 使用道具 举报
不错哦
回复 使用道具 举报
程序员小虾米 来自手机 初级黑马 2018-1-25 14:44:21
10#
6666666666
回复 使用道具 举报
相当牛逼
回复 使用道具 举报
连我个不懂技术的都觉得6
回复 使用道具 举报
回复 使用道具 举报
小皖妹妹 来自手机 黑马粉丝团 2018-1-25 17:04:33
14#
(●ˇOˇ●)
回复 使用道具 举报
回复 使用道具 举报
6666
回复 使用道具 举报
点赞支持
回复 使用道具 举报
回复 使用道具 举报
我是一匹小黑马Y 发表于 2017-12-8 16:58
感觉回到了班级中午演讲的时候了

是不是很怀念呀
回复 使用道具 举报

你这是啥表情
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马