当前位置:网站首页>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 .
边栏推荐
- Talk about DART's null safety feature
- Wechat forum exchange applet system graduation design completion (7) Interim inspection report
- CAIP2021 初赛VP
- Redhat下安装fedora
- 高级程序员必知必会,一文详解MySQL主从同步原理,推荐收藏
- [microservices SCG] gateway integration Sentinel
- STL标准模板库(Standard Template Library)一周学习总结
- I wish you all the best and the year of the tiger
- iNFTnews | NFT技术的广泛应用及其存在的问题
- Classification and prediction of heartbeat signal
猜你喜欢
13、 System optimization
Adults have only one main job, but they have to pay a price. I was persuaded to step back by personnel, and I cried all night
【微服务|SCG】gateway整合sentinel
Brush question 4
Installing spss25
【编译原理】词法分析设计实现
Matlab-SEIR传染病模型预测
2021ICPC上海 H.Life is a Game Kruskal重构树
聊聊支付流程的设计与实现逻辑
Technology at home and abroad people "see" the future of audio and video technology
随机推荐
十四、数据库的导出和导入的两种方法
USB(十五)2022-04-14
Network security - joint query injection
系统架构设计师备考经验分享:论文出题方向
[microservices SCG] gateway integration Sentinel
What are the similarities and differences between smart communities and smart cities
智慧社區和智慧城市之間有什麼异同
Grid
2021-01-11
When copying something from the USB flash disk, an error volume error is reported. Please run CHKDSK
UE4_UE5结合罗技手柄(F710)使用记录
Installing spss25
GEE(三):计算两个波段间的相关系数与相应的p值
智慧社区和智慧城市之间有什么异同
14、 Two methods of database export and import
Comparison of various development methods of applets - cross end? Low code? Native? Or cloud development?
Txt file virus
云原生数据仓库AnalyticDB MySQL版用户手册
解决:信息中插入avi格式的视频时,提示“unsupported video format”
Unity3D学习笔记5——创建子Mesh