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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夜默 金牌黑马   /  2013-8-26 18:31  /  1753 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射能做到的,我自己用一般方法都能解决,反射到底简单在哪?

8 个回复

倒序浏览
额....我也要问问
回复 举报
一个类封装以后,里面的属性和方法是看不到的,但通过反射的方式可以得到

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

回复 举报
本帖最后由 xscn 于 2013-8-26 19:01 编辑

不用反射可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods内容体),并生成其对象实体、或者对其fields设值、唤起其methods吗???
只要得到一个类的字节码,反射就能完成上面的所有操作,用普通方法怎么做出来?其实字节码这个词太不容易理解了,我觉得翻译成类模板更合适。

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

回复 举报
[1]. 陈述反射的好处
传统方法操作字段,创建对象并调用对象的的构造方法在步骤上一定是比用反射来操作要简单。但是传统的方法来操作却有很多特殊的地方使得写出的程序无法通用化。这个时候,反射的好处就彰显出来。反射给出的程序框架适合任何类型的程序。一旦涉及到程序种特殊的地方在反射中全部采用字符串的形式进行了传参。

[2]. 举例说明
假设有一个Person类,现在采用传统的方法作如下操作

  1. class Person{
  2.        
  3.         public void paramMethod(String name, int age){
  4.                 System.out.println(name+"**"+age);
  5.         }
  6. }
复制代码
测试代码

  1. Person p =new Person();
  2. p.paramMethod("Benjamin", 110);
复制代码
从这段代码看,类名Person、类中所使用的方法paramMethod必须硬编码写入程序。如果想改借助这段代码成调用Student类的xxx方法,是没有办法重用的。但是  通过反射可以做到这一点。

我在这里把类名Person、类中所使用的方法paramMethod称为采用使用传统方法中的涉及到的程序的个性化地方。那么这些个性化的地方在反射中采用字符串的形式进行了格式化。格式化之后,可以达到通用的效果。因此反射同样的一段代码,通过传入不同的字符串参数实现了对不同类名和不同方法名的操作。这样既可以做成通用的程序框架。我下面画了一个图来表示反射和传统方法的对应关系。
从图中可以看出,原本传统操作特殊的部分Perosn和parmaMethod都在反射中都变成了字符串的形式出现。这样变换字符串的内容就可以操作其他类的不同名的方法。这就是反射对传统程序的格式化和通用化。反射的这种功能为框架技术奠定了基础,即同样的一套程序可以操作用户未知的类和类中的方法。
结论:反射就是对传统方法操作对象的格式化

new和Method.jpg (224.92 KB, 下载次数: 6)

反射和传统的区别

反射和传统的区别

点评

哥们很深入吖!  发表于 2013-8-27 12:44

评分

参与人数 1技术分 +2 收起 理由
夜默 + 2

查看全部评分

回复 举报 1 0
JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;
* 对于任意一个对象,都能够调用它的任意一个方法和属性;
* 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。  
*  
* 动态获取类中信息,就是java反射 。
* 可以理解为对类的解剖。

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

回复 举报
框架的时候需要用反射。还有就是访问私有的和动态代理的时候也需要
如果知识普通的调用,当然还是一般方法简单。
回复 举报
一个框架的某一部分已经想到用什么功能,那么给这个框架定义一个空间位置来存放这个,这个时候提供这个功能的类还没出现,不过向外提供了类名称,我们就可以给这个类定义功能,这个功能我们自己定义...
感觉就是提供了扩展性,不过破坏了安全性什么的

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

回复 举报
您需要登录后才可以回帖 登录 | 加入黑马