Javassist之內省與定製(四)
本章為上一章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語句。
相關文章
- Java安全之Javassist動態程式設計Java程式設計
- 【JavaEE】Java內省Introspector、PropertyDescriptor與JavaBeanJavaROSBean
- MySQL 8 複製(四)——GTID與複製MySql
- java 內省(Introspector)JavaROS
- goim 架構與定製Go架構
- Junit、Assert、內省、Properties類與配置檔案的使用
- C++模板的定製四:定製成員函式和預設類參 (轉)C++函式
- 聊聊Java內省IntrospectorJavaROS
- java內省api的操作JavaAPI
- scrapy定製爬蟲-爬取javascript內容爬蟲JavaScript
- Android定製ROM,內嵌su和xposedAndroid
- css+js 設定網頁內容不可複製或可複製CSSJS網頁
- javassist庫介紹__API詳解JavaAPI
- 省錢又不失格調!九個遊戲製作省錢大法遊戲
- 【SQL*Plus】列格式化命令之 “NUL[L] text”——定製NULL的顯示內容SQLNull
- iOS開發之定製輸入框iOS
- EA:五年之內不製作VR遊戲VR遊戲
- 內省機制(操作javaBean的資訊)JavaBean
- Objective-C的Introspection(內省)ObjectROS
- 利用類反射模擬內省功能反射
- Spark UI (基於Yarn) 分析與定製SparkUIYarn
- SpringBoot彩蛋之定製啟動畫面Spring Boot動畫
- 製作一套ERP/CRM系統,七天內即可定製完成!
- python內建物件型別(四)序列之dict字典Python物件型別
- JVM 內部原理(四)— 基本概念之 JVM 結構JVM
- JUC之執行緒間定製化通訊執行緒
- (原)製造行業供應鏈的思考系列之四行業
- 人工智慧+新聞業:幫助記者定製內容人工智慧
- Flutter動畫之Flare的製作與使用Flutter動畫
- 軟體定製開發與SaaS的區別
- 定製Tinycore
- react之四種元件中DOM樣式設定方式React元件
- redis入門指南(四)—— redis如何節省空間Redis
- 四川省密碼科創產業園密碼產業
- 死磕 java集合之TreeMap原始碼分析(四)-內含彩蛋Java原始碼
- Spring Cloud Gateway實戰之四:內建predicate小結SpringCloudGateway
- ElasticSearch7.3 學習之定製分詞器(Analyzer)Elasticsearch分詞
- JAVA基礎之介面與內部類Java