您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
04-aop简介-基于jdk的动态代理
发布时间:2025-01-15 13:46:32编辑:雪饮阅读()
-
目标接口
package sp21.proxy.jdk;
public interface TargetInterface {
public void save();
}
目标的实现
package sp21.proxy.jdk;
public class Target implements TargetInterface{
public void save() {
System.out.println("save running...");
}
}
增强
package sp21.proxy.jdk;
public class Advice {
public void before(){
System.out.println("前置增强....");
}
public void afterReturning(){
System.out.println("后置增强....");
}
}
代理示例逻辑
package sp21.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
//目标对象
final Target target=new Target();
//增强对象
final Advice advice=new Advice();
/*
这里的返回值说是和上面这个target属于是兄弟关系,所以不建议用Target来接收,而是用其父亲类也就是TargetInterface进行接收
我感觉似懂非懂,那就暂时不求甚解,后面或许经历更多之后就懂了
*/
TargetInterface proxy=(TargetInterface) Proxy.newProxyInstance(
//参数1:目标对象类加载器
target.getClass().getClassLoader(),
//参数2:目标对象相同的接口字节码对象数组
target.getClass().getInterfaces(),
new InvocationHandler() {
//调用代理对象的任何方法,实质执行的都是invoke方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//前置增强
advice.before();
//执行目标方法
Object invoke=method.invoke(target,args);
//后置增强
advice.afterReturning();
//这里,你直接返回null都行,因为我的save方法实质上也没有返回什么,当然我这里为了规范点,返回下也可以
return invoke;
}
}
);
//调用代理对象的方法
proxy.save();
}
}
关键字词:aop,jdk,代理
相关文章
- 31、 Service 代理模式分类
- 14_Filter_案例2_过滤敏感词汇_实现(动态代理设计模式
- 13_动态代理2_增强方法(invoke的调用与方法入参与方法
- 12_动态代理1_基本实现步骤(动态代理设计模式)
- workerman系列之再談socket5代理s5優化
- http反向代理環境下获取真实ip(基於workerman)
- https在反向代理環境下获取真实ip(基於workerman實現)
- 基於workerman實現ws获取真實客戶端ip(反向代理環境下)
- workerman系列之nginx配置反向代理于workerman時候實
- workerman作爲客戶端系列之socket5即s5代理搭建基於ce