一个例子:比如说,eclipse这个软件是先开发好的,你的程序是后写的。为什么eclipse能给你类型的上下文关键字提示,当你输入一个对象,会有一个列表列出所有的对象的方法,这个就是靠的反射。
一个道理,eclipse上有很多插件,明显先有的eclipse后有的插件,那么 eclipse 怎么创建和调用这些插件呢?还是需要反射。
Java 反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。
总结: 通常,我们通过类来创建对象,然后利用这个对象来调用方法,从而获得这个类的属性和方法,但是利用反射机制,我个人理解就是,反射就是让你可以随便调用你没有实例化的东西,因为类在实例化之后就固定了,而反射就打破了这种固定模式,即使你的类没有被实例化加载到内存中,你一样可以在你要使用的时候找到它。
张孝祥说:“反射就是把Java类中的各种成分映射成相应的java类”,其细节方面就是你通过自己编写代码来将类加载到java虚拟机中,也有人称“反射”为“类的自解析”。
通过反射可以让程序变得更加灵活。
-
反射:将类的各个组成部分封装为其他对象,这就是反射机制
-
好处:
- 可以在程序运行过程中,操作这些对像。
- 可以解耦,提高程序的可扩展性。
获取Class对象的方式:
-
Class. forName("全类名") :将字节码文件加载进内存,返回class对象
- 多用于配道文件,将类名定义在配做文件中。读取文件,加载类
-
类名.class :通过类名的以性c lass获取
- 多用于参数的传递
-
对像.getclass() : getclass()方法在object类中定义着。
- 多用于对象的获取字节码的方式
-
结论:
同一个字节码文件(* .class)在一次程序运行过程中,只会被加载一次, 不论通过哪-种方式获取的Class对象都是同一个。
Class对象功能:
-
获取功能:
- 获取成员变量们
- 获取构造方法们
- 获取成员方法们
- 获取类名
-
method.invoke();