Java動態(tài)代理--JDK實現(xiàn)

java動態(tài)代理JDK實現(xiàn)

步驟

定義接口

public interface Hello {

    void sayHi();
}

目標類(實現(xiàn)上面的接口)

public class HelloImpl implements Hello{

    public void sayHi() {
        System.out.println("睡你麻痹起來嗨");
    }
}

實際處理類

實現(xiàn)InvocationHandler接口

public class DynamicProxy implements InvocationHandler {

    private Object target;

    public DynamicProxy(Object target){
        this.target=target;

    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result=method.invoke(target,args);
        after();
        return result;
    }

    public void before(){
        System.out.println("不想起床");
    }

    public void after(){
        System.out.println("就算起來了也嗨不起來");
    }
    }

JDK的Proxy類創(chuàng)建代理類

 public static void main(String[] args){
        Hello hello=new HelloImpl();

        DynamicProxy dynamicProxy=new DynamicProxy(hello);
        Hello helloProxy=(Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(),hello.getClass().getInterfaces(),dynamicProxy);

        helloProxy.sayHi();
    }

優(yōu)化

可以看到Proxy動態(tài)代理創(chuàng)建過程中需要的參數(shù):hello,dynamicProxy在DynamicProxy類中都有,可以做如下簡化。

DynamicProxy

    public <T> T getProxy(){
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

優(yōu)點

如果一個接口有多個實現(xiàn)類,對這些實現(xiàn)類創(chuàng)建代理類只需要這一個DynamicProxy就好了,不需要做其他的修改。如果需要在方法的前后做不同的事情,只用定義不同的DynamicProxy,里面的before和after方法完成相應(yīng)的功能就好了。就算接口發(fā)生了變化,代理類也不用變化。

缺點

如果要代理沒有實現(xiàn)任何接口的類就不行了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容