Javassist之內省與定製(四)

weixin_33762321發表於2018-06-30

本章為上一章Javassist之內省與定製(三)的續章,兩章的內容相關很大,請先閱讀上一章的內容。

上一章我們介紹了Javassist方法體修改的部分方式,本章將介紹剩餘的部分。

javassist.expr.NewExpr

一個NewExpr物件表示使用new操作符的物件建立(不包括陣列建立)。如果發現物件建立,ExprEditor的edit()方法接收這個物件。NewExpr的replace方法接收表示要替換物件建立的語句或程式碼塊的原始碼文字。

在原始碼文字中,以$開頭的字元有著特殊的含義:

$0 null
$1,$2,... 構造方法的引數
$_ 物件建立的返回值。一個新建立的物件會被儲存在這個變數中。
$r 建立的物件的型別
$sig 一個java.lang.Class的物件陣列,它表示正式的引數型別。
$type 一個java.lang.Class物件,表示建立物件的類。
$proceed 一個執行初始物件建立的虛擬方法的名稱。

其它的識別符號例如,$w,$args$$一樣可以使用。

javassist.expr.NewArray

一個NewArray物件表示使用new操作符的陣列建立。如果發現陣列建立,ExprEditor的edit()方法將會接收這個物件。NewArray的replace()方法接收表示要替換陣列建立的語句或程式碼塊的源文字。

在源文字中,以$開頭的識別符號有特殊的意義:

$0 null
$1,$2,... 每一個維度的大小
$_ 陣列建立的返回值。一個新的建立的陣列將會被儲存在這個變數。
$r 建立的陣列的型別。
$type 一個java.lang.Class物件,它表示建立陣列的類。
$proceed 一個執行初始陣列建立的虛擬方法的名稱。

其它的識別符號例如,$w,$args$$一樣可以使用。

例如,如果陣列建立的表示式如下,

String[][] s = new String[3][4];

那麼$1$2各自的值為3和4。$3無法獲取。

如果陣列建立表示式如下,

String[][] s = new String[3][];

那麼$1的值是3,而$2的值無法獲取。

javassist.expr.Instanceof

一個Instanceof物件表示一個instanceof表示式。如果發現一個instanceof表示式,ExprEditor的edit()會接收這個物件。Instanceof的replace方法接收要替換表示式的語句或程式碼塊的源文字。

在原始碼文字中,以$開頭的識別符號有特殊的含義:

$0 null
$1 原本instanceof操作符左邊的值
$_ 表示式的結果。$_的是boolean型別。
$r instanceof操作符右邊的型別。
$type 一個java.lang.Class物件,表示instanceof操作符右邊的型別。
$proceed 執行原instanceof表示式的虛擬方法的名稱。它接收一個引數( java.lang.Object型別)。如果引數的型別是instanceof右邊的型別,返回true,否則返回false。

其它的識別符號例如,$w,$args$$一樣可以使用。

javassist.expr.Cast

一個Cast物件,表示一個顯式的型別轉換表示式。如果發現顯式的型別轉換表示式,ExprEditor的edit()接收這個物件。Cast的replace()方法接收表示要替換表示的語句或程式碼塊的源文字。

在原始碼文字中,以$開頭的識別符號有特殊的餓含義:

$0 null
$1 顯式轉換的型別的值
$_ 表示式的結果。$_的型別是轉換後的由()包圍的型別。
$r 顯式轉換的型別,或者由()包圍的型別。
$type 一個java.lang.Class物件,與$r相同。
$proceed 一個執行初始型別轉換的虛擬方法的名稱。它接收一個java.lang.Object型別的引數,返回原顯式轉換表示式轉換後的結果。

​ 其它的識別符號例如,$w,$args$$一樣可以使用。

javassist.expr.Handler

一個Handler物件,表示try-catch語句的catch。如果發現catch,ExprEditor的edit()方法會接收這個物件。Handler的insertBefore()編譯接收的源文字同時插入到catch語句的開始位置。

在源文字中,以$開頭的識別符號有如下含義:

$1 catch語句捕獲的異常物件
$r catch語句捕獲的異常物件的型別。它常用在強制轉換表示式中。
$W 包裝型別。它常用在強制轉換表示式中。
$type 一個java.lang.Class物件,表示catch語句捕獲的異常的型別。

如果新的異常物件被賦值給$1,它會作為被捕獲的異常傳給初始catch語句。

相關文章