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

