JDK动态代理

动态代理是实现AOP的绝好底层技术。

JDK动态代理
主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。
InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。
Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。

例子如下:

//目标类
public class ForumServiceImpl Implements ForumService{
    public void removeTopic(int topicId) {
        System.out.println("模拟删除Topic记录" + topicId);
        try {
            Thread.currentThread().sleep(20);
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
}

//InvocationHandler 编织目标业务类逻辑和横切逻辑代码
public class PerformanceHandler implements InvocationHandler {
    private Object target;//目标业务类
    public PerformanceHandler(Object target){
        this.target = target;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        PerformanceMonitor.begin(
    target.getClass().getName()+"."+Method.getName());                 
        Object obj = method.invoke(target, args);//通过反射方法调用业务类的目标方法
        PerformanceMonitor.end();
        return obj;
    }
}

//创建代理实例
public class TestForumService {
    public static void main(String[] args) {
        ForumService target = new ForumServiceImpl();//希望被代理的目标类
        PerformanceHandler handler = new PerformanceHandler(target);//将目标业务类和横切代码类编织到一起
        ForumService proxy =  (ForumService)Proxy.newProxyInstance(
        target.getClass().getClassLoader(),
        target.getClass().getInterfaces(),
        handler);//根据编织了业务类逻辑和性能监视横切逻辑的InvocationHandler实例创建代理实例

        proxy.removeTopic(10);//调用代理实例
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值