我记得网上有个关于反射很通俗的解释:
java是个大美女,但大美女有很多事情是规定不让你做的.反射就是把枪,有枪在手,你想让大美女做什么事就做什么事,脱光了都没问题.
正常的解释:Java的反射是指程序在运行期可以拿到一个对象的所有信息。是一种动态获取对象信息以及动态调用对象的方法。最常见的场景就是在动态代理。而动态代理应用最广的地方就是各种框架,比如:Spring。
反射必定离不开 Class 对象。都知道,代码编写完后是要编译成 .class 文件的。这里的一个个 .class 文件,被虚拟机加载到内存后就是以 Class 对象存在,一个类只能有一个 .class 文件,因此,一个类也就对应一个 Class 对象,Class 对象是类的描述信息,比如:字段、方法、注释等等等等,只要你想得到的类结构,他在 Class 对象内都有体现,并且都能通过 Class 对象获取到。
总结:class
(包括interface
)的本质是数据类型(Type
)
以String
类为例,当JVM加载String
类时,它首先读取String.class
文件到内存,然后,为String
类创建一个Class
实例并关联起来:
Class cls = new Class(String);
由于JVM为每个加载的class
创建了对应的Class
实例,并在实例中保存了该class
的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class
实例,我们就可以通过这个Class
实例获取到该实例对应的class
的所有信息。
这种通过Class
实例获取class
信息的方法称为反射(Reflection)。
如何获取一个class
的Class
实例?有三个方法:
(1)
直接通过一个class
的静态变量class
获取:
Class cls = String.class;
(2)
如果我们有一个实例变量,可以通过该实例变量提供的getClass()
方法获取:
String s = "Hello";
Class cls = s.getClass();
(3)
如果知道一个class
的完整类名,可以通过静态方法Class.forName()
获取:
Class cls = Class.forName("java.lang.String");
具体理解:Class类 - 廖雪峰的官方网站
动态代理实际上是JVM在运行期动态创建class字节码并加载的过程。
后续增加....