Java反射的基本理解

1.什么是反射?

我记得网上有个关于反射很通俗的解释

java是个大美女,但大美女有很多事情是规定不让你做的.反射就是把枪,有枪在手,你想让大美女做什么事就做什么事,脱光了都没问题.

正常的解释:Java的反射是指程序在运行期可以拿到一个对象的所有信息。是一种动态获取对象信息以及动态调用对象的方法。最常见的场景就是在动态代理。而动态代理应用最广的地方就是各种框架,比如:Spring。

2.反射的内容和应用

2.1 class对象

反射必定离不开 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)。

如何获取一个classClass实例?有三个方法:

(1)

扫描二维码关注公众号,回复: 13822517 查看本文章

直接通过一个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类 - 廖雪峰的官方网站

2.2 代理

动态代理实际上是JVM在运行期动态创建class字节码并加载的过程。

后续增加....

猜你喜欢

转载自blog.csdn.net/qq_35207086/article/details/123228659
今日推荐