动态代理的分析与应用

       今天给同事简单的演示了一下JDK的代理写法,在此也把代码贴出来,作为一个学习笔记。

       动态代理的核心思想是不修改原有类和方法的基础上能添加一些功能,Spring的AOP是一个经典实现。好了,废话不多说,上代码。

       第一段代码是一个接口,没什么好说的。

public interface Handler {

    public void handle();
}
       下面一段代码是具体实现类,我们要代理的也是这个类,实现比较简单。
public class MyHandler implements Handler{

    public void handle(){
        System.out.println("myHandler................");
    }
}
下面代码是我们真正的核心,具体的Proxy类。这个类继承于InvocationHandler,只有一个方法,invoke方法。第一个参数我开始还以为是代理的具体类,就是我下面要引入的myHandler,后来发现其实是这个类本身。所以这个类在这里没有多大用处,第二个参数很好理解,具体代理类的代理方法,第三个就是参数了。代理类中传进具体的代理类myHandler。

public class ProxyHandler implements InvocationHandler{
    
    private MyHandler myHandler;
    
    public void setMyHandler(MyHandler myHandler) {
        this.myHandler = myHandler;
    }

    /* (non-Javadoc)
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        System.out.println("method:"+method.getName()+",proxy:"+method.getDeclaringClass().getName());
        method.invoke(myHandler, args);
        System.out.println("after");
        return null;
    }
}
开始写Client端代码了。

public class Client {

    public static void main(String[] args){
        MyHandler myHandler = new MyHandler();
        ProxyHandler ph = new ProxyHandler();
        ph.setMyHandler(myHandler);
        Handler proxy = (Handler) Proxy.newProxyInstance(Client.class.getClassLoader(), new Class<?>[]{Handler.class}, ph);
        proxy.handle();
    }
}
最后看看具体的输出。

before
method:handle,proxy:com.example.proxy.Handler
myHandler................
after




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值