您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關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代理有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。