目前Java開發包中包含了對動態代理的支持,但是其實現只支持對接口的的實現。 其實現主要通過java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。
Proxy類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現
1.定義一個接口:
package com.lvyuanj.test;
/**
* 定義一個HelloWorld接口
*
* @author lvyuanj
*
*/
public interface HelloWorld {
public void sayHelloWorld();
}
2.類HelloWorldImpl是HelloWorld接口的實現
package com.lvyuanj.test;
/**
* 類HelloWorldImpl是HelloWorld接口的實現
*
* @author lvyuanj
*
*/
public class HelloWorldImpl implements HelloWorld{
public void sayHelloWorld() {
System.out.println("HelloWorld!");
}
}
3.HelloWorldHandler是 InvocationHandler接口實現
package com.lvyuanj.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 實現在方法調用前後向控制檯輸出兩句字符串
*
* @author lvyuanj
*
*/
public class HelloWorldHandler implements InvocationHandler{
//要代理的原始對象
private Object obj;
public HelloWorldHandler(Object obj) {
super();
this.obj = obj;
}
/**
* 在代理實例上處理方法調用並返回結果
*
* @param proxy 代理類
* @param method 被代理的方法
* @param args 該方法的參數數組
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
//調用之前
doBefore();
//調用原始對象的方法
result=method.invoke(obj, args);
//調用之後
doAfter();
return result;
}
private void doBefore(){
System.out.println("before method invoke");
}
private void doAfter(){
System.out.println("after method invoke");
}
}
4.測試類
package com.lvyuanj.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class HelloWorldTest {
public static void main(String[] args) {
HelloWorld helloWorld=new HelloWorldImpl();
InvocationHandler handler=new HelloWorldHandler(helloWorld);
//創建動態代理對象
HelloWorld proxy=(HelloWorld)Proxy.newProxyInstance(
helloWorld.getClass().getClassLoader(),
helloWorld.getClass().getInterfaces(),
handler);
proxy.sayHelloWorld();
}
}
運行結果爲: