天天看點

Java中動态代理工作流程

  當談到動态代理就會想到接口,因為接口是一種規範,動态代理對象通過接口便會很清楚地知道他的實作類(被代理對象)是何種類型的(即有哪些方法)。Now,然我們來開始編寫一個例子來了解動态代理的全過程:

第一:既然接口那麼好使,就先定義一個接口Action

package com.lzj.Spring_first.testAgentMyPractice;

public interface Action {
//    定義方法
    public void say();
    public void doSomething();
}      

第二:既然有了接口,接下來咱們就得有實作類。是以再定義Action的實作類ActionImpl

package com.lzj.Spring_first.testAgentMyPractice;

public class ActionImpl implements Action {

    @Override
    public void say() {
        System.out.println("Study hard...day day up...");

    }

    @Override
    public void doSomething() {
        System.out.println("Nothing wants to be done...");

    }

}      

第三:既然要代理,就必須弄個代理對象,我這裡是實作的java.lang.reflect下的InvocationHandler接口。spring架構也有自己的InvocationHandler接口,這個隻要保證你引入的包一緻即可,不要引了java.lang下的又引spring下的就行

package com.lzj.Spring_first.testAgentMyPractice;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class AgentFunc implements InvocationHandler{
//    要被代理的對象
    Object target;
    public AgentFunc(Object target) {
        this.target = target;
    }
//    代理對象執行的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub
        return method.invoke(target, args);
    }

}      

第四:完事具備,就差一個測試方法了,Come on...

package com.lzj.Spring_first.testAgentMyPractice;

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
//        要被代理的對象
        ActionImpl actionImpl = new ActionImpl();
//       第一個是代理類在哪個類執行時加載
//       第二個參數是實作類實作的接口,而不能寫成Action.class.getInterfaces()顯然是錯誤的,因為該接口沒有接口,而且第二參數要的是實作類的接口即Action
//       第三個則是代理類的執行方法所在,即我們寫的代理類
        Action action = (Action) Proxy.newProxyInstance(Action.class.getClassLoader(), new Class[]{Action.class}, new AgentFunc(actionImpl));
     action.say();
   } 
}
      

 最後輸出結果...親測成功,自己可以去試試!好了以上僅是自己對動态代理的獨自見解,如有出處可以留言...