當談到動态代理就會想到接口,因為接口是一種規範,動态代理對象通過接口便會很清楚地知道他的實作類(被代理對象)是何種類型的(即有哪些方法)。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();
}
}
最後輸出結果...親測成功,自己可以去試試!好了以上僅是自己對動态代理的獨自見解,如有出處可以留言...