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