黑马程序员技术交流社区

标题: 反射出来的实例对象 [打印本页]

作者: 孙宁洋    时间: 2013-6-1 11:40
标题: 反射出来的实例对象
该如何理解Class类实例出来的对象在内存中的存在状态呢?和直接new一个类的对象有和不同
作者: 石贤芝    时间: 2013-6-1 14:53
本帖最后由 石贤芝 于 2013-6-1 14:58 编辑

//早期:new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,
//         并创建该字节码文件对象(即Class),并接着创建该字节码文件对应的Person 对象。
cn.itcast.bean.Person p = new cn.itcast.bean.Person();
               
//现在用反射的时候:
String name = "cn.itcast.bean.Person";
//找寻该名称类的字节码文件,并加载进内存,并产生Class对象。
Class clazz = Class.forName(name);
//创建 Person 对象
Object obj  = clazz.newInstance();

也就是说,第一句代码 和 后三句代码的功能是一样的,等价的。 原来一句代码能搞定的事情,在反射的时候要用这三句代码组合才可以搞定。
作者: 刘海芳    时间: 2013-6-1 16:17
说说我自己的理解:
java反射在一定程度上会影响性能的,打个比分:就像你要进一小区,如果你正常在门卫处等级了,如果你想懒着不出来肯定不行呀,因为有登记记录,如果你翻墙进去了,你懒着不走,他们也不知道呀,等他们慢慢检查才可以。而new与反射就有点两者的关系。所有使用反射可以调用私有的东东。呵呵,这是我的理解,不一定正确哦:
  1. 1.基本上效果差不多,但是new对象,无法调用该类里面私有的东西,反射反之,具体怎么做请参考java AIP,不过反射需要以牺牲性能做代价。

  2. 2.在不知道类名的情况下,你怎么去new?我相信很多人看到这句话都迷糊了(新手),肯定有这样的疑问,不知道类名,你怎么反射啊?

  3. 那么接下来在讲讲new和反射本质上的区别,new属于静态编译,而反射属于动态编译,意思就说只有到运行时他才会去获得该对象的实例,可能讲的有些抽象(也有可能讲的不太正确)

  4. 举例:spring框架是事先就写好的框架,他内部的处理并不知道用户要写哪些类,应为那是以后由用他的人来定的,这时候你还能在spring内部去new吗?所以用户在用的时候才去配置文件中配置类路径,这是一个典型反射的例子,在很多面试中就问道了这个问题。
复制代码

作者: 殇_心。    时间: 2013-6-1 18:01
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2