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程式設計
- MySQL 8 複製(四)——GTID與複製MySql
- 吾日內省
- goim 架構與定製Go架構
- 聊聊Java內省IntrospectorJavaROS
- 熱門內容定製產品再出“爆款”,看《趕海王》的定製之路
- java內省api的操作JavaAPI
- css+js 設定網頁內容不可複製或可複製CSSJS網頁
- SpringBoot彩蛋之定製啟動畫面Spring Boot動畫
- javassist庫介紹__API詳解JavaAPI
- Objective-C的Introspection(內省)ObjectROS
- Spark UI (基於Yarn) 分析與定製SparkUIYarn
- python內建物件型別(四)序列之dict字典Python物件型別
- 製作一套ERP/CRM系統,七天內即可定製完成!
- 省錢又不失格調!九個遊戲製作省錢大法遊戲
- spring-boot定製和最佳化內嵌的TomcatSpringbootTomcat
- JUC之執行緒間定製化通訊執行緒
- Spring Cloud Gateway實戰之四:內建predicate小結SpringCloudGateway
- Kubernetes官方java客戶端之四:內部應用Java客戶端
- react之四種元件中DOM樣式設定方式React元件
- 內省機制(操作javaBean的資訊)JavaBean
- 軟體定製開發與SaaS的區別
- 定製Tinycore
- ElasticSearch7.3 學習之定製分詞器(Analyzer)Elasticsearch分詞
- 死磕 java集合之TreeMap原始碼分析(四)-內含彩蛋Java原始碼
- Python中的賦值與淺複製與深複製之間的關係Python賦值
- JAVA基礎之介面與內部類Java
- redis入門指南(四)—— redis如何節省空間Redis
- 教你一分鐘搭建小程式,支援小程式內容定製!
- Flutter 入門與實戰(四):設定 App 的主色調與字型FlutterAPP
- 類與介面(二)java的四種內部類詳解Java
- 人工智慧發展與模型定製化趨勢人工智慧模型
- Flutter動畫之Flare的製作與使用Flutter動畫
- 【Android】安卓四大元件之內容提供者Android安卓元件
- 【定製ERP】企業ERP體系的強大之處
- Dockerfile定製映象Docker
- SpringBoot:定製 ActuatorSpring Boot
- 3D動畫製作的四大勝人之處3D動畫