黑马程序员技术交流社区

标题: 反射理解的困惑 [打印本页]

作者: 黑马_郑亮新    时间: 2012-11-30 14:10
标题: 反射理解的困惑
看视频的时候张孝祥讲到的:反射就是将java类的中的各个成分映射成相应的 java类,但觉得不容易理解,比较困惑。
我觉得是不是可以这样理解:反射就是将程序中的类或者接口中各个成分映射成对应的字节码,字节码不仅是Class类的实例对象,也是实例化对象中的成分。
打个比方汽车是一个程序,设计图纸就是汽车的字节码,设计图纸里有对应的零部件设计图(是不是可以理解为字节码里还有字节码???),然后通过图纸反射出汽车各部分的信息.....

请大神们各自说说对反射的理解。。。。
作者: 李栋梁    时间: 2012-11-30 14:27
反射就是把运行的java程序的信息“暴露”出来,一个类可以有多个对象 ,但是只可能有一个.class文件,我们可以通过反射得到运行的JAVA程序的信息取出来(包括类的包名,方法,成员变量等)
作者: 杨永胜    时间: 2012-12-2 18:34
反射就是通过对象来获得类的信息,操作类的功能。因为效率和安全性其他方面不常用,常使用的是动态链接程序,代理机制
作者: 丁桂松    时间: 2012-12-2 23:30
所谓的反射机制就是java语言在运行时拥有一项自观能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.什么是自观能力,按照童姥的说法就是照镜子.可以通过反射查看自身类的构造函数,字段,方法以及所有其他的由语言而产生的元素/反射可以做的不单单是简单的列举类.字段和方法.通过反射还能够在需要的时候完成创建实例.调用方法和访问字段的工作.反射是java被视为动态语言的关键.
我对反射的功能进行了归纳如下:
在运行时可以判断任意一个对象所属的类.
在运行时间可以构造任意一个类的对象.
通过这四个对象我们可以简单的看到一个类的各个组成部分.可以对每个类做一个解剖,

先说Class,Class是什么?
Class类可以说是java反射的起源.针对任何一个你想勘探的类.只有先为它产生一个Class类的对象.接下来才能通过Class对象获取其他想要的信息.

理解Class:
大家知道我们定义一个文本文件Abc.java.你并不能说他是个java代码文件.只有通过javac编译编译成Abc.class字节码文件.才能称之为java代码文件.在java代码的运行过程中这个阶段叫做java代码的第一个阶段.源文件阶段(source阶段)
Java源文件通过类加载(ClassLoader)进入内存生成对象.这个阶段就是Class类阶段.Java在运行时,系统会对所有的对象进行所谓的运行时类型标识.用来保存这些类型的信息的类就是Class类.Class类封装一个对象和接口运行时的状态.java为每种类型的管理着一个独一无二的Class对象.java 程序运行过程中,当需要创建一个类的实例时.JVM首先检查所要加载的类对应的Class对应的Class对象是否已经存在.如果还不存在.JVM就会根据就会根据类名查找对应的字节码文件并加载.接着创建对应的Class对象.最后才创建出这个类的实例.
也就是说,运行中的类或者接口在jvm中都会有一个对应的Class对象存在.它保存了对应类和接口的类型信息.要想获取类和接口的相关信息.需要先获取这个Class对象.(Class类阶段)
拿到了类以后创建对象 newInstance.有了实例对象,调用方法 runtime运行时阶段
Class 对象在java中用一个Class对象来表示一个java类的class阶段Class对象封装了一个java类中定义的成员变量、成员方法、构造方法、类名、包名等
在运行时判断任意一个类所具有的成员变量和方法.
在运行时调用任意一个对象的方法.通过反射甚至可以调用到private的方法
生成动态代理.
反射用在哪里到底框架是什么? 框架就是将开发中大量重复的代码集中起来写个通用的程序框架就是用反射来实现的框架需要现在的类调用将来写的类框架是将来的程序员调用的,框架不能实现完整的功能,框架只是一些一些通用的代码框架要运行一定会依赖将来写的类现在写的类要调用将来写的类,我们先针对接口进行调用,将来的类需要实现接口,那么方法就固定了但是将来写的类的类名我们无法获知,这时就需要调用者通过配置文件告诉框架具体的类名




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