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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙宁洋 中级黑马   /  2013-6-1 11:40  /  1350 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

该如何理解Class类实例出来的对象在内存中的存在状态呢?和直接new一个类的对象有和不同

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 石贤芝 于 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();

也就是说,第一句代码 和 后三句代码的功能是一样的,等价的。 原来一句代码能搞定的事情,在反射的时候要用这三句代码组合才可以搞定。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

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

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

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

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

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马