這篇文章主要介紹了Java 反射實作 Aop 代理,小編覺得還挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
利用反射生成JDK的動態代理,也就是AOP中的AOP代理,代替目標物件,從而在程式碼中織入增強。
定義代理接口
由於JDKf動態代理只能為接口創建動態代理,故先定義接口,假定我們需要對數據的Save方法添加事務處理,我們有一個UserDao接口,裡面有一個Save方法,程式碼如下:
public interface UserDao { public void save(); }
定義代理實
下面具體來實作介面定義的Save方法,我們採用下面的程式碼來實作。
public class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("I am save user...."); } }
定義增強程式碼
我們有以下的操作,在儲存使用者之前開啟事務,在儲存使用者之後提交事務,在增強程式碼中定義兩個方法before()和after(),分別用在save()方法的執行開始之前和執行之後。
public class UserTx { public void before(){ System.out.println("before save....."); } public void after(){ System.out.println("after save......"); } }
定義Invocation handler
之所以要定義handler是因為執行動態代理時,實際執行的是handler裡面的invoke()方法,這樣的話,我們在invoke()方法裡面自訂方法的內容,因此就達到了代理和增強的邏輯和效果。
public class UserDaoInvocationHandler implements InvocationHandler { / 需要代理的对象 / private Object proxyObj; / 指定我们需要代理的对象 @param proxyObj */ public void setProxyObj(Object proxyObj) { this.proxyObj = proxyObj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { UserTx tx = new UserTx(); tx.before(); Object resultObj = method.invoke(proxyObj, args); tx.after(); return resultObj; } }
測試結果
上面已經定義好所有的東西,我們就實際來動態代理我們指定的對象,用代理後的對象來執行我們要執行的方法,驗證是否代理成功。
import java.lang.reflect.Proxy; public class ProxyTst { public static void main(String[] args) { // proxy object UserDao target = new UserDaoImpl(); // invocation handler UserDaoInvocationHandler handler = new UserDaoInvocationHandler(); handler.setProxyObj(target); // proxy UserDao targeted = (UserDao) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); // execute proxyed object targeted.save(); } }
執行上面的程式碼之後我們可以在控制台看見如下的輸出,證明UserDao已經被成功代理,同時我們也為我們的程式成功的添加了事務功能。
before save..... I am save user.... after save......
以上是Java反射實作Aop代理的程式碼案例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!