Java的動态代理主要是指位于java.lang.reflect包下的Proxy類,在使用過程中會用到同一個包下的InvocationHandler接口。
loader是目标類的類加載器,
interfaces是目标類實作的接口(并不一定是它實作的所有接口,用Class<?>[]類型表示就可以了),
h是InvocationHandler類型的一個對象。
proxy是代理對象,
method是目标方法,
args是目标方法的參數清單。
所謂動态代理其實就是這樣的一種對象:它是在程式運作時動态生成的對象,在生成它時你必須提供一組接口給它,然後該對象就宣稱它實作了這些接口。你當然可以把該對象當作這些接口中的任何一個來用。當然,這其實就是一個代理對象,它不會替你作實質性的工作,在生成它的執行個體時你必須提供一個handler,由它接管實際的工作。
接口:
public interface StudentDao {
public void test1();
public void test2();
public void test3();
public void test4();
}
public interface StudentDao2 {
public void t();
目标類:
public class StudentDaoImpl implements StudentDao ,StudentDao2{
//對接口方法的實作
Handler:
public class MyInvocationHandler implements InvocationHandler {
private Object target;
private List<String> matchNames=null; //用來控制對目标類的那些方法做功能上的改變
public MyInvocationHandler() {
}
public MyInvocationHandler(Object target) {
this.target = target;
matchNames=new ArrayList<String>();
matchNames.add("test1");
matchNames.add("test2");
matchNames.add("test3");
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName=method.getName();
if(matchNames.contains(methodName)){
System.out.println("========begin transaction=========");
}
Object ret = method.invoke(target, args);
System.out.println("========end transaction==========");
return ret;
測試類:
public static void main(String[] args) {
StudentDaoImpl dao=new StudentDaoImpl();
MyInvocationHandler handler=new MyInvocationHandler(dao);
StudentDao proxy=(StudentDao)Proxy.newProxyInstance(
dao.getClass().getClassLoader(),
new Class<?>[]{StudentDao.class},
handler);
proxy.test1();
proxy.test2();
proxy.test3();
proxy.test4();
運作結果:
========begin transaction=========
==========目标方法:test1()============
========end transaction==========
==========目标方法:test2()============
==========目标方法:test3()============
==========目标方法:test4()============
本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/245254,如需轉載請自行聯系原作者