代理模式-动态代理(基于接口,JDK动态代理)cglib代理和jdk动态代理区别
动态代理
- 静态代理
- 动态代理
静态代理
这里我们介绍了静态代理,也知道了静态代理的一些缺点
代理模式-静态代理
下面我们就介绍动态代理
动态代理
JDK动态代理,需要2个类,基于接口,用到反射
- Proxy:代理
- InvocationHendler:调用处理程序
基于上面的静态代理,我们现在代码调整有一下,什么Faker英雄联盟代打啊,飞牛FLY王者荣耀代打啊,我们都不要了,开一个代练公司,来实现动态代理。
我们的动态代理为
package com.lingaolu.impl;
import com.lingaolu.service.PlayerLogin;
import java.lang.reflect.*;
/**
* @author 林高禄
* @create 2020-11-09-18:12
*/
public class ActingTrainingCompany implements InvocationHandler {
private PlayerLogin playerLogin;
public ActingTrainingCompany(PlayerLogin playerLogin) {
this.playerLogin = playerLogin;
}
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),playerLogin.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(playerLogin, args);
return invoke+"变为王者";
}
}
客户测试
我们还可以做的更完美一些,因为目前我们动态代理的只是PlayerLogin抽象类,我们可以修改代码,改为万能的动态代理类
package com.lingaolu.impl;
import java.lang.reflect.*;
/**
* @author 林高禄
* @create 2020-11-09-18:12
*/
public class ActingTrainingCompany implements InvocationHandler {
private Object target;
public ActingTrainingCompany(Object target) {
this.target= target;
}
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(target, args);
return invoke+"变为王者";
}
}
现在我们加需求,吃鸡也要代练,那么只需要我们的抽象角色和真实角色添加相关方法即可,动态代理无需修改
客户测试只需要再调用吃鸡方法即可,动态代理代码无需改变
这就解决了静态代理的缺点
代理模式-动态代理(基于接口,JDK动态代理)jdk动态代理和cglib动态代理
代理模式-静态代理模式 代理模式-动态代理(基于接口,JDK动态代理)动态代理是代理模式吗
最详细的代理讲解--JDK动态代理和cglib代理cglib代理和jdk动态代理区别
动态代理:JDK动态代理和CGLIB代理的区别cglib代理和jdk动态代理区别
JDK动态代理和 CGLIB代理cglib代理和jdk动态代理区别
总结:静态代理、jdk动态代理、cglib代理cglib代理和jdk动态代理区别
jdk动态代理和cglib动态代理cglib代理和jdk动态代理区别
JDK动态代理和CGLib动态代理的对比cglib代理和jdk动态代理区别