Atitti 類庫 開發者 常用 api 目錄 1.1. Meta anno註解元資料api 1 1.2. Ref 反射api 1 1.3. Database meta api 1 1.4.
阿新 • • 發佈:2018-12-07
Atitti 類庫 開發者 常用 api
目錄
如果你正在編寫一個框架或者類庫。有一些受歡迎的位元組碼庫如javassist和Cglib Nodep asm可以供你選擇,他們可以讓你閱讀和修改應用程式生成的位元組碼。
目前位元組碼修改技術有ASM,javassist,cglib,BCEL等。cglib就是基於封裝的Asm. Spring 就是使用cglib代理庫。關於cglib的使用介紹,
它已加入了開放原始碼JBoss 應用伺服器專案,通過使用Javassist對位元組碼操作為JBoss實現動態AOP框架
java動態性的兩種常見實現方式
- 位元組碼操作
- 反射
執行時操作位元組碼可以讓我們實現如下功能:
- 動態生成新的類
- 動態改變某個類的結構(新增/刪除/修改 新的屬性/方法)
優勢:
- 比反射開銷小,效能高
- JAVAasist效能高於反射,低於ASM
CGLIB
是一個強大的,高效能,高質量的Code生成類庫,基於ASM實現。
JAVAssist
- 是一個開源的分析、編輯和建立java位元組碼的類庫,效能較ASM差,跟cglib查不到,但是使用簡單
JAVAssist庫的API
- javassist最外層的API和Java的反射包中的API頗為類似、
- 它主要有CtClass,CtMethod,以及CtField及各類組成。用以執行和JDK反射API中java.lang.Class,java.lang.reflect.Method,java.lang.reflect.Method.Field相同的操作。
侷限性:
- JDK5.0行語法不支援(包括泛型、列舉),不支援註解修改,但可以通過底層的javassist類來解決,具體參考javassist.bytecode.annotation
- 不支援陣列的初始化,如String[]{“1”,“2”},除非只有陣列的容量為1
- 不支援內部類和匿名類
- 不支援continue和btreak表示式
- 對於繼承關係,有些不支援,例如: