1. 程式人生 > >Aspectj中call與execution區別,織入程式碼位置不同

Aspectj中call與execution區別,織入程式碼位置不同

call 呼叫通知的環境是方法呼叫位置;而execution是方法執行位置,也就是方法簽名處。

具體結合一個示例可以更簡單跟容易理解:

1、pointcut配置:

    pointcut callPointCut():execution(public void com.javartisan.aspectj1.HelloWorld.say(String));

此時是執行環境,檢視一下被織入切面之後的位元組碼:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.javartisan.aspectj;

import com.javartisan.aspectj.HelloWorldAspect;

public class HelloWorld {
    public HelloWorld() {
    }

    public void say() {
        try {
            HelloWorldAspect.aspectOf().ajc$before$com_javartisan_aspectj_HelloWorldAspect$1$88992c11();
            System.out.println("Hello World!");
        } catch (Throwable var2) {
            HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();
            throw var2;
        }

        HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();
    }

    public static void main(String[] args) {
        (new HelloWorld()).say();
    }
}

2、pointcut配置

    pointcut callPointCut(String name, int age):call(public void com.javartisan.aspectj2.HelloWorld.say(String,int))&&args(name,age);

織入切面的位元組碼如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.javartisan.aspectj;

import com.javartisan.aspectj.HelloWorldAspect;

public class HelloWorld {
    public HelloWorld() {
    }

    public void say() {
        System.out.println("Hello World!");
    }

    public static void main(String[] args) {
        HelloWorld var10000 = new HelloWorld();

        try {
            HelloWorldAspect.aspectOf().ajc$before$com_javartisan_aspectj_HelloWorldAspect$1$88992c11();
            var10000.say();
        } catch (Throwable var2) {
            HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();
            throw var2;
        }

        HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();
    }
}

對比1與2可以知曉:

call是在呼叫處進行織入通知程式碼,而對於execution是在連線點方法內部織入通知程式碼。

相關推薦

Aspectjcallexecution區別程式碼位置不同

call 呼叫通知的環境是方法呼叫位置;而execution是方法執行位置,也就是方法簽名處。 具體結合一個示例可以更簡單跟容易理解: 1、pointcut配置: pointcut callPointCut():execution(public

字串處理sizeofstrlen區別以及末尾的\0

char *ch = "wonima aisaoziaaa"; int n = sizeof(ch); // 指標長度,對於64平臺來說,值為8 int nn = sizeof(*ch); // 一個字元的長度,值為1 int nnn = strlen(ch); //

Java&&&的區別|||的區別

這個是轉載別人的 個人感覺不錯, 在java中,很多人都不知道&與&&,|與||的區別。 &,&&:(與,短路與):一樣的地方就是二者執行最後的結果是一樣的,但是執行的過程有區別, 對於&:無論&左邊是

關於EL表示式requestScope和param區別el表示式jstl標籤

今天演示EL表示式的時候發現自己jsp的基礎實在是薄弱,在這個很簡單的問題上迷惑了很久。 首先在看遇到的問題: 在瀏覽器地址輸入,表示傳入一個引數test,值為123 http://localhost:8888/Test/index.jsp?test=123 在in

C#outref區別

erro 變量 但是 color 賦值 運行 網上 ann amp 一、ref(參考)與out區別 1、out(只出不進) 將方法中的參數傳遞出去,在方法中將該參數傳遞出去之前需要在該方法起始賦初值;在方法外傳遞的該參數可以不用賦值; 簡單理解就是:將一個東西拋出去之前必須

iOSxibstoryboard原理Android界面布局的異同

ast int mvc color ron rect sdn -m control 用文本標記語言來進行布局,用的最多的應該是HTML語言。HTML能夠理解為有一組特殊標記的XML語言。 一、iOS中xib與storyboard顯示原理 在iOS中基

javascriptcall apply的區別

控制臺 pre asc child tex func highlight java 屬性和方法 obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1, arg2, ...]); 兩者作用一致,都是

jsdecodeURI()和encodeURI()區別decodeURIComponent和encodeURIComponent區別

nbsp sch www 問題 encode 替換 副本 字符替換 序列 decodeURI()定義和用法:decodeURI()函數可對encodeURI()函數編碼過的URI進行解碼.語法:decodeURI(URIstring)參數描述:URIstring必需,一個字

jQueryposition()offset()區別

元素 page mini alert span 文檔 back www. class jQuery中position()與offset()區別 position()獲取相對於它最近的具有相對位置(position:relative或position:absolute)

dos命令rem ::的區別

dos命令 一行 .html 等等 nbsp article 字符 log 註釋 參考: http://www.cnblogs.com/followyourdream/articles/3445862.html rem *** 是一條命令, 占一行 : **

[轉]MyBatisresultTyperesultMap區別

作用 進一步 sel 存在 其中 對象 直接 model ati MyBatis中關於resultType和resultMap的具體區別如下: MyBatis中在查詢進行select映射的時候,返回類型可以用resultType,也可以用resultMap。resultTy

struts2 ServletActionContextActionContext區別

copy 實現 沒有 action ins page comm 獲得 有一點 1. ActionContext 在Struts2開發中,除了將請求參數自動設置到Action的字段中,我們往往也需要在Action裏直接獲取請求(Request)或會話(Session)的一些信

MySQLMyISAMInnoDB區別及選擇,mysql添加外鍵

title 必須 pan 就會 默認 簡化 平臺 兩種 myisam InnoDB:支持事務處理等不加鎖讀取支持外鍵支持行鎖不支持FULLTEXT類型的索引不保存表的具體行數,掃描表來計算有多少行DELETE 表時,是一行一行的刪除InnoDB 把數據和索引存放在表空間裏面

ajax請求contentTypedataType區別

服務器 ajax 字符串 解析 div script http 使用 自動 contentType: 告訴服務器,我要發什麽類型的數據,默認值: "application/x-www-form-urlencoded"。 dataType:告訴服務器,我要想什麽類型的數據。如

pythonbreakcontinue區別

print 方法 其中 dom 我們 spa strong bre 語法 1.在其他語言中break與continue也被經常使用到,其中用法稍微有些去別,下面我們使用python的語法結構來看看是否和在其他語言中的使用方法一致。 continue:是跳出本次循環,進入到下

javaa++++a區別

demo div main highlight print class 結果 public 別了 java中a++與++a區別 a++與++a的區別,如果單獨使用沒有任何區別,如果在運算中就有區別了,a++是先運算在賦值,而++a是先賦值在運算!! class dem

Python的 // / 的區別

區別 best 浮點數 b- eui 精確 2.x 大於 ext 通常C/C++中,"/ " 算術運算符的計算結果是根據參與運算的兩邊的數據決定的,比如:  6 / 3 = 2 ; 6,3都是整數,那麽結果也就是整數2;  6.0 / 3.0 = 2.0 ; 6.0,3.0

MySQLMyISAMInnoDB區別及選擇

重建 包含 好的 數據 mysql 備份 處理 表空間 種類 InnoDB:支持事務處理等不加鎖讀取支持外鍵支持行鎖不支持FULLTEXT類型的索引不保存表的具體行數,掃描表來計算有多少行DELETE 表時,是一行一行的刪除InnoDB 把數據和索引存放在表空間裏面跨平臺可

VUE datamethods區別

報錯 data back color 數據 con 全部 ack ken ``` let vm=new Vue({ //根實例 el:‘#app‘, data:{//都是數據 }, methods:{ // methods 和data中的數據會全部放到vm上,而且名字不

WPFAuto*的區別

p s ren con 分配 log enter vertical net back 原文:WPF中Auto與*的區別 Auto 表示自動適應顯示內容的寬度, 如自動適應文本的