黑马程序员技术交流社区

标题: 请谈下对反射的理解 [打印本页]

作者: 党传才    时间: 2012-4-26 12:59
标题: 请谈下对反射的理解
反射的视频看完了,老师讲的似乎也懂了,但是感觉还是理解的不深入,还是感觉有点模糊,抓不住的感觉,什么时候使用更是感觉很迷茫?
请大家谈谈对反射的理解,借鉴参考,谢谢
作者: 刘永菲    时间: 2012-4-26 13:16
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
很简单,就好像你站在镜子面前,通过镜子的反射,你可以知道自己衣着以及动作等等,Java的反射就是通过反射机制,可以知道对象的属性和方法等等
作者: 毕博    时间: 2012-4-26 13:18
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
打个比方,三鹿生产奶粉,检验检疫把奶粉拿去化验才发现里面有三聚氰胺。
生产的过程就是创建对象 new XXX
通过成分判断里面含有三聚氰胺 就是反射机制。

作者: 党传才    时间: 2012-4-26 13:20
刘永菲 发表于 2012-4-26 13:16
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能 ...

怎么样用反射得到一个类的字节码啊?
作者: 刘永菲    时间: 2012-4-26 14:46
        详细内容API都有,我找出来框架,你有兴趣可以自己再去找。
        Java的反射机制是通过反射API来实现的,它允许程序在运行过程中取得任何一个已知名称的类的内部信息.反射API位于java.lang.reflect包中.主要包括以下几类:
         1).Constructor类:用来描述一个类的构造方法
        2).Field类:用来描述一个类的成员变量
        3).Method类:用来描述一个类的方法.
        4).Modifer类:用来描述类内各元素的修饰符
        5).Array:用来对数组进行操作.
   希望能帮助你

作者: 党传才    时间: 2012-4-26 14:57
刘永菲 发表于 2012-4-26 14:46
详细内容API都有,我找出来框架,你有兴趣可以自己再去找。
        Java的反射机制是通过反射API ...

谢谢啦,有爱的同学
作者: 光sail    时间: 2012-4-26 15:25
Java 反射机制主要提供了以下功能
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法
1.  要想使用反射,首先需要获得待处理类或对象所对应的Class 对象。
2.  获取某个类或某个对象所对应的Class 对象的常用的3 种方式:
a)  使用Class 类的静态方法forName:Class.forName(“java.lang.String”);
b)  使用类的.class 语法:String.class;
c)  使用对象的getClass()方法:String s = “aa”; Class<?> clazz = s.getClass();
3.  若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
a)  先获得Class 对象,然后通过该Class 对象的newInstance()方法直接生成即可:
    Class<?> classType = String.class;
    Object obj = classType.newInstance();
b)  先获得Class 对象,然后通过该对象获得对应的Constructor 对象,再通过该Constructor
    对象的newInstance()方法生成:
    Class<?> classType = Customer.class;
    Constructor cons = classType.getConstructor(new Class[]{});
    Object obj = cons.newInstance(new Object[]{});
4.  若想通过类的带参数的构造方法生成对象,只能使用下面这一种方式:
    Class<?> classType = Customer.class;
    Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});
    Object obj = cons.newInstance(new Object[]{“hello”, 3});
5.  Integer.TYPE 返回的是int,而Integer.class 返回的是Integer 类所对应的Class 对象。


作者: 罗旭维    时间: 2012-4-26 16:01
反射是为了描述程序里‘类’这个事物而存在的。
从和它相关的那些类,如Class、Method、Field来看,他们描述了组成‘类’这个事物的成分。
类是由方法和成员组成的每个类都有对应的字节码所以,反射就用Class描述字节码,Method描述类的成员方法,Field描述它的属性。
作者: 孙天    时间: 2012-4-26 16:55
一个应用程序加载需要后期出现的类。这种情况可以使用反射技术开完成
反射技术可以提高程序的扩展性
通过反射技术可以完成对指定名称的类进行对象的创建和内容的调用
其实反射技术就是动态获取一个类并获取类中的所有内容
简单说:反射就是对类的解剖
作者: 王敏NO.09    时间: 2012-4-26 16:55
   Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类。 在运行时构造任意一个类的对象。 在运行时判断任意一个类所具有的成员变量和方法。 在运行时调用任意一个对象的方法。
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。


作者: 翟友伟    时间: 2012-4-26 17:22
楼主有没有看过 美国大片   科幻类的  (犯罪现场 或者   <<真实的谎言>>  和 《机器公敌》
特别是 克隆技术的
美国顶级反恐 犯罪的机构    只需要在 犯罪现场    提取一滴血液样本,或者 指纹  ,精斑 甚至一根头发  就可以判定 和锁定犯罪对象。。


头发(对象)   
头发中的DNA(字节码)     
是独一无二的

可以豪不夸张的说  FBI可通过遗留犯罪现场的头发
。就可知道你的性别 身高 血型 等等。(get Filed属性) 科学家现在考古挖掘古代人的骨头就可以判定当然骨头所有者

甚至可以  用技术手段 复制出和你一模一样的兄弟出来冒充你 , 复制的基础就是你的DNA。(Constructor和 invoke)

或者获取和你一模一样专有的 行为(get Method) to  kill 某人 嫁祸你 。

总而言之  就 是     我不需要知道你是谁!但只要给我 你身上的任何细胞或者什么的  我可以造出和你一样的人。 克隆羊技术啊。

作者: 邓斌    时间: 2012-4-26 17:32
翟友伟 发表于 2012-4-26 17:22
楼主有没有看过 美国大片   科幻类的  (犯罪现场 或者     和 《机器公敌》
特别是 克隆技术的 ...

呵呵。这比喻很有想象力。不过应该说我想变谁就变谁,前提是我需要知道你是谁(得到字节码)
作者: 亚男    时间: 2012-4-26 17:52
反射用于框架,比如之前就写好的程序,那我现在想要调用就可以用反射,像在连接jdbc时,那些数据库的开发商早就把驱动写好了,那这时也可以用反射把驱动加载过来,没第二种加载方式了。
获得字节码的方法:
获取一个类的        类名.class()
获取一个对象的
对象.getClass(); Class静态方法





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