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
1.7 Reference resources
https://blog.csdn.net/yaomingyang/article/details/80981004
https://zhuanlan.zhihu.com/p/60805342
https://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful