当前位置:网站首页>Dynamic agent explanation (July 16, 2020)
Dynamic agent explanation (July 16, 2020)
2022-07-07 23:17:00 【codepig16】
A dynamic proxy (2020.7.16)
characteristic : Create as you go , Load as you go
effect : Enhance the existing methods without modifying the source code
classification : Interface based dynamic proxy and subclass based dynamic proxy
First, let's introduce dynamic agents to a specific scenario , Suppose there is a computer manufacturer producer It wants to sell computers , So there's one Producer Classes and sale Method :
public class Producer {
public int sale(int money) {
System.out.println(" Sell a computer to make a profit " + money);
return money;
}
}
If the manufacturer sells a computer to the consumer , Then you can make profits :
public static void main(String[] args) {
Producer producer = new Producer();
producer.sale(1000);
}
But in real life , We all know that when we buy computers, we will not buy computers from computer manufacturers , It must be going to the mall , That is, the computer dealer goes to buy a computer , The requirement now is not to change the original manufacturer's code , We should divide computer profits , Is to enhance the method of selling computers , Here we need to use our dynamic proxy . Let users pay part of the money to computer manufacturers , Part to the dealer .
Here are two dynamic proxy methods and how they are implemented .
Proxy A dynamic proxy
It is Based on interfaces Dynamic proxy for , yes JDK Self contained , No additional jar package . It requires the proxy object to implement at least one interface , Otherwise, you cannot use this dynamic proxy .( Here we implement one Iproducer Interface , Defines a manufacturer's specification ).
* Dynamic agent based on Interface :
* Involved in the class :Proxy
* Provider :JDK official
* How to create a proxy object :
* Use Proxy Class newProxyInstance Method
* Requirements for creating proxy objects :
* The proxy class implements at least one interface , If not, you can't use
* newProxyInstance Method parameters :
* ClassLoader: Class loader
* It is used to load the bytecode of the proxy object . Use the same classloader as the proxied object . Fixed writing .
* Class[]: Bytecode array
* It is used to make the proxy object and the proxy object have the same method . Fixed writing .
* InvocationHandler: Used to provide enhanced code
* It's to let us write about how agents . We are generally implementation classes of this interface , Usually it's an anonymous inner class , But it's not necessary .
* The implementation classes of this interface are written by who .
It should be noted that the execution of each method of the proxied object will pass invoke Method , It acts as an interceptor , We are in invoke Method to enhance the original method . The meanings of the parameters are :
/
* effect : Any interface method that executes the proxied object passes through this method
* Meaning of method parameters
* @param proxy References to proxy objects
* @param method The current method of execution
* @param args Parameters required for the current execution method
* @return It has the same return value as the represented object method
* @throws Throwable
/*
Cooperate with the following code to better understand , stay main Function to simulate a consumer's consumption process :
public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
IProducer producer_proxy = (IProducer)Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
int resultValue = 0;
int money = (int) args[0];
if (method.getName().equals("sale")) {
resultValue = (int) method.invoke(producer, money/2);
}
return resultValue;
}
});
producer_proxy.sale(500);
}
}
cglib A dynamic proxy
It is a dynamic proxy based on subclasses , When the proxied object does not implement an interface , also Not the final class When , You can use this dynamic proxy mode .
* Dynamic agent based on subclass :
* Involved in the class :Enhancer
* Provider : The third party cglib library
* How to create a proxy object :
* Use Enhancer Class create Method
* Requirements for creating proxy objects :
* The proxied class cannot be the final class
* create Method parameters :
* Class: Bytecode
* It is the bytecode used to specify the proxy object .
*
* Callback: Used to provide enhanced code
* It's to let us write about how agents . We are generally implementation classes of this interface , Usually it's an anonymous inner class , But it's not necessary .
* The implementation classes of this interface are written by who .
* We usually write the sub interface implementation class of this interface :MethodInterceptor
*/
Like interface based dynamic proxy inctercept Method is also an interceptor
```public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
IProducer producer_cglib = (IProducer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
int resultValue = 0;
int money = (int) objects[0];
if (method.getName().equals("sale")) {
resultValue = (int) method.invoke(producer, money/2);
}
return resultValue;
}
});
producer_cglib.sale(1000);
}
matters needing attention
- Dynamic proxy represents objects , For example, in the example above producer, What is enhanced is the method in the object
- Dynamic proxies are not useless , We often use dynamic agents to solve problems , In the thread pool close, Because when the thread pool is closed, the thread needs to return to the thread, not log off at the bottom , It can be realized by dynamic proxy .
- Spring Medium AOP Technology is implemented through dynamic agents , Greatly simplify the writing of code , Enhance the code without changing the code we write .
边栏推荐
- Coreseek:第二步建索引及測试
- 网络安全-sqlmap与DVWA爆破
- Txt file virus
- [untitled] reprint melting ice - track icedid server with a few simple steps
- Why does the market need low code?
- Brush question 6
- Brush question 4
- CXF call reports an error. Could not find conduct initiator for address:
- Matlab 信号处理【问答随笔·2】
- The 19th Zhejiang Provincial Collegiate Programming Contest VP记录+补题
猜你喜欢
JMeter interface automated test read case, execute and write back result
十四、数据库的导出和导入的两种方法
ArcGIS: two methods of attribute fusion of the same field of vector elements
Wechat forum exchange applet system graduation design (3) background function
Specific method example of V20 frequency converter manual automatic switching (local remote switching)
Cases of agile innovation and transformation of consumer goods enterprises
UE4_UE5结合罗技手柄(F710)使用记录
iNFTnews | NFT技术的广泛应用及其存在的问题
Matlab 信号处理【问答随笔·2】
JMeter-接口自动化测试读取用例,执行并结果回写
随机推荐
Opencv scalar passes in three parameters, which can only be displayed in black, white and gray. Solve the problem
When copying something from the USB flash disk, an error volume error is reported. Please run CHKDSK
七月第一周
Inftnews | the wide application of NFT technology and its existing problems
网络安全-安装CentOS
Transform XL translation
Why does the market need low code?
Wechat forum exchange applet system graduation design (5) assignment
Network security - Eternal Blue
Network security - joint query injection
Bit operation
Gee (IV): calculate the correlation between two variables (images) and draw a scatter diagram
Brush question 5
The wonderful relationship between message queue and express cabinet
三菱PLC slmp(mc)协议
Introduction to anomaly detection
智慧社區和智慧城市之間有什麼异同
ArcGIS:矢量要素相同字段属性融合的两种方法
Talk about the design and implementation logic of payment process
网络安全-beef