springAOP中用joinpoint獲取切入點方法的參數(shù)操作
springAOP joinpoint獲取切入點方法的參數(shù)
概念:
訪問目標方法即用jointpoint(@around用poceedingjointpoint)
1.獲取他們的目標對象信息, 如test.component@80387a這種
2.還有獲取帶參方法的參數(shù), 如[Ljava.lang.Object;@183cfe9(想當然我們也可以用對象的arrays.toString()方法將其還原)
3.另外還有獲取被增強的方法相關信息 如String test.component.test1(String)這種
總結:訪問目標方法參數(shù), 有三種方法(實際有四種,先說三種)
joinpoint.getargs():獲取帶參方法的參數(shù)
注:就是獲取組件中test方法中的參數(shù),如果test方法中有多個參數(shù),那么這個方法機會返回多個參數(shù).想要哪個就通過for循環(huán)加上判斷來篩選
2.joinpoint.getTarget():獲取他們的目標對象信息
3..joinpoint.getSignature():(signature是信號,標識的意思):獲取被增強的方法相關信息.其后續(xù)方法有兩個
getDeclaringTypeName:返回方法所在的包名和類名
getname():返回方法名
看不懂,請看代碼!
組件類
@Component public class component { public void test() { } public void test1(String name2) { } }
我以@afterreturning為例解說
我們先看3 Signature方法
@AfterReturning(value="execution(* test.*.*(..))",returning="name2") private void test1(JoinPoint jp ,String name2) { System.out.println(jp.getSignature()); System.out.println(jp.getSignature().getName()); System.out.println(jp.getSignature().getDeclaringTypeName()); }
Signature方法下的輸出結果
你看,
getSignature());是獲取到這樣的信息 : 修飾符+ 包名+組件名(類名) +方法名
getSignature().getName()); :方法名
getSignature().getDeclaringTypeName()): 包名+組件名(類名)
我們再看1 getargs()
System.out.println(jp.getArgs()); System.out.println(Arrays.toString(jp.getArgs()));
結果輸出
jp.getArgs():我們會得到一個 看不懂一組數(shù)組對象,但是我們知道這是一個對象,參數(shù)對象 Arrays.toString(jp.getArgs()) 但是我們可以用Arrays類中數(shù)組轉字符串方法:arrays.tostring(返回指定數(shù)組內容以字符串表示出來) 就可以得到具體數(shù)字了
3.getTarget()方法:該方法返回被織入增強處理的目標對象.(這個和getthis()方法很相似 但是的出來的值不相等)
System.out.println(jp.getTarget());
輸出結果
是一個實實在在的對象,既不是參數(shù)也不是相關信息
總結:以上就是訪問目標方法的參數(shù)的所有方法(除了getthis()沒有說其實也是返回一個對象生成的代理對象
得出的對象與gettarget()方法很相似幾乎可以說是一模一樣的,但是我用過.eqauls和==都不相等)這些方法,讓我想起了 document(dom)編程的獲取元素docuemnt.getelementbyid(); 獲取這些元素可以進行修改或者觀察自己代碼是否有異樣。
使用JoinPoint獲取被通知方法參數(shù)并傳遞給通知方法
提供訪問當前被通知方法的目標對象、代理對象、方法參數(shù)等數(shù)據
package org.aspectj.lang; import org.aspectj.lang.reflect.SourceLocation; public interface JoinPoint { String toString(); //連接點所在位置的相關信息 String toShortString(); //連接點所在位置的簡短相關信息 String toLongString(); //連接點所在位置的全部相關信息 Object getThis(); //返回AOP代理對象 Object getTarget(); //返回目標對象 Object[] getArgs(); //返回被通知方法參數(shù)列表 Signature getSignature(); //返回當前連接點簽名 SourceLocation getSourceLocation();//返回連接點方法所在類文件中的位置 String getKind(); //連接點類型 StaticPart getStaticPart(); //返回連接點靜態(tài)部分 }
用于環(huán)繞通知,使用proceed()方法來執(zhí)行目標方法
public interface ProceedingJoinPoint extends JoinPoint { public Object proceed() throws Throwable; public Object proceed(Object[] args) throws Throwable; }
訪問連接點的靜態(tài)部分,如被通知方法簽名、連接點類型等
public interface StaticPart { Signature getSignature(); //返回當前連接點簽名 String getKind(); //連接點類型 int getId(); //唯一標識 String toString(); //連接點所在位置的相關信息 String toShortString(); //連接點所在位置的簡短相關信息 String toLongString(); //連接點所在位置的全部相關信息 }
特別說明:JoinPoint 必須是第一個參數(shù)
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringSecurity數(shù)據庫進行認證和授權的使用
本文主要介紹了用戶的賬號、密碼以及角色信息在數(shù)據庫中的認證和授權,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08