The first 1 Chapter Reflection and agency
1.1 Reflection definition
1.1.1 Explain the reflection in vernacular
In general , The premise of needing a function is that there is a problem , Here are some questions , And then how to solve these problems through reflection , To introduce the definition of reflection .
The most common problem in the work of ordinary developers ： Need to generate proxy objects （ If you don't know the agency model , It can be simply understood as the need to put a class , Without changing the code of this class , To add new logic to the functionality of this class ）
Solution ： Classes that will need to be strengthened , utilize Reflection After loading , Integrate with the logic of complementation , Create a new object , This object is the proxy object , With the original class and new logic “ Enhanced classes ”（ such as Man There is a eat() Method , We want to implement eat() Methods wash hands before and after 、 The washing up logic , And we can't just modify eat() Method ）
The above is the most straightforward explanation of reflection in a concise way , The following is a comparison major 、 comprehensive The explanation of ：
1.1.2 What is reflex ？
Reflection (Reflection) yes Java One of the features of programming languages , It allows running Java The program gets its own information , And you can manipulate the internal properties of a class or object .
By reflection mechanism , You can access... At run time Java Object properties , Method , Construction method, etc
Reflective application scenarios ：
Develop a common framework - The most important use of reflection is to develop a variety of generic frameworks . A lot of frames （ such as Spring） It's all configured （ Such as through XML File configuration JavaBean、Filter etc. ）, In order to ensure the universality of the framework , They may need to load different objects or classes based on the configuration file , Call different methods , You have to use reflection at this time —— The runtime dynamically loads the objects that need to be loaded
A dynamic proxy - Programming in Section （AOP） in , Need to intercept specific methods , Usually , Will choose the dynamic proxy mode . At this time , We need reflection technology to achieve
annotation - The annotation itself is just a marker , It needs to use the reflection mechanism , Call the annotation interpreter according to the annotation tag , Execution . If there is no reflection mechanism , Annotations are not more useful than annotations
Scalability features - Applications can use external user-defined classes by creating extensible object instances with fully qualified names
1.2 Reflection and proxy involve the term
To understand the relationship between reflection and proxy in the next section , First of all, let's introduce the terms that will be involved ：
Real object （ Proxied object ）： Is the object generated by the most primitive class instantiation , It has not been processed and enhanced by agent mode , For example, as mentioned above Man Class object
Proxy object ： Object enhanced with proxy pattern , such as SuperMan object
Dynamic proxy class ： It can be understood as a proxy object logical processor , It can also be understood as “ enhance ” Where is the logic of , You need to pass in the real object to generate the associated dynamic proxy object
InvocationHandler Interface ： Dynamic proxy classes need to implement this interface , And rewrite invoke() Method ,“ enhance ” The logic of this is written in invoke In the method , Each instance of the proxy class is associated with a Handler, When we call a method through a proxy object , A call to this method is forwarded InvocationHandler This interface's invoke Method to make the call
Proxy： proxy class , After the dynamic proxy object is passed in , Generate a real proxy object
1.3 The relationship between reflection and proxy
As mentioned above , The main role of the proxy pattern is to generate proxy objects to implement enhanced methods , And reflection as Java One of the features provided , It is the foundation of implementing proxy pattern . In other words , Using reflection technology to acquire and manipulate Java Classes in programs , Thus, these classes can be packaged and processed , Generate proxy objects .
Get the proxy object that implements the class object ：
2.1 call Proxy.newProxyInstance To get a dynamic proxy object , It takes three parameters , The meanings of the three parameters are respectively ：
① One ClassLoader object , Defined by which ClassLoader Object to load the generated proxy object
② One Interface An array of objects , What is the set of interfaces that I'm going to provide to the object that I need to proxy , If I provide a set of interfaces to it , The proxy object then claims to implement the interface ( polymorphic ), So I can call methods in this set of interfaces
③ One InvocationHandler Implementation class object of , Represents when my dynamic proxy object is calling a method , Which one does it relate to InvocationHandler On the implementation class object of
3. Get the class object of the proxy object （ Here we can print the class name of the class object of the proxy class ）
4. Get all the methods of the proxy class （ Through violent reflection getDeclaredMethods（） get ）（ Traverse all the obtained methods , Output all method names ）
5. The method of implementing class is called by proxy object （ And the assignment ）, Trigger our key steps ： InvocationHandler In the implementation class of the interface invoked（） Method , To execute the method that implements the class （sout Output the result ）（ This step is called non intrusive coding rules ）
5.1 call InvocationHandler The interface steps are as follows ：
After triggering the method that implements the class , The first thing you need to do is InvocationHandler Three parameters are passed in the interface , Namely
① proxy: - Refers to the real object that we are representing
② method: - It refers to a method that we want to call on a real object Method object （）
③ args: - Refers to the parameters that are accepted when a method is called on a real object
After that, the interface specific invoked（） Method , Pass in two parameters , They are the real implementation class object and the parameters passed in args, Finally, return the method .
1.4 JDK Dynamic proxy sum CGLIB Dynamic proxy differences
Agency mode , It's all through inheriting real objects （ Proxied object ） After implementing the interface it implements , It's done by adding enhanced logic .
JDK Dynamic proxy is accomplished by implementing the interface , So when a class is generated by implementing an interface , Just use JDK A dynamic proxy
CGLIB Dynamic proxy is accomplished by inheriting classes , So when a class doesn't implement an interface , You can only use JDK A dynamic proxy
1.5 Reflection frame
Java It provides the reflection to obtain the class properties and methods of the class , But the premise is that the class can be obtained and operated accordingly , And the reflection frame Reflections Not only can we get classpath The following classes , It can also be retrieved from specific annotations .
Reflections By scanning classpath, Index metadata , And it allows you to query the metadata at run time .
Use Reflections You can easily access the following metadata information ：
- Get all subclasses of a type
- As long as the type 、 Constructors 、 Method , Fields with specific annotations , You can get all the information with this annotation （ type 、 Constructors 、 Method , Field ）
- Get all the resources that match a regular expression
- Get all the methods with a specific signature , Including the parameters , Parameter annotation , Return type
- Get the names of all methods
- Get all the fields in the code 、 Method name 、 The use of constructors
1.6 JsonCat The use of dynamic proxies for
jsoncat Project links ：https://github.com/Snailclimb/jsoncat