1.動態編譯
1.介紹
jdk1.6后引入動態編譯機制
應用場景:
可以做一個瀏覽器端撰寫java代碼,上傳服務器編譯和運行的在線評測系統
服務器動態加載某些類檔案進行編譯
兩種方法:
通過Runtime呼叫編譯器,啟動顯得行程去操作
通過JavaCompiler動態編譯
通過反射運行編譯好的類
2.通過JavaCompiler動態編譯

第一個null:為編譯器提供引數
第二個null:得到java編譯器的輸出資訊
第三個null:接受編譯器的錯誤資訊
sourceFile:可變引數(String陣列)能傳入一個或多個java源檔案的地址
回傳值:0代表編程成功,非0則編譯失敗
3.通過反射運行編譯好的類

2.通過腳本引擎執行js代碼
JAVA腳本引擎是從JDK6.0之后添加的新功能, 腳本引擎介紹: – 使得 Java 應用程式可以通過一套固定的介面與各種腳本引擎互動,從 而達到在 Java 平臺上呼叫各種腳本語言的目的, – Java 腳本 API 是連通 Java 平臺和腳本語言的橋梁, – 可以把一些復雜異變的業務邏輯交給腳本語言處理,這又大大提高了 開發效率,
3.位元組碼操作
java動態性的兩種常見實作方式:位元組碼操作和反射
運行時操作位元組碼可以實作:動態生成新的類,動態改變某個類的結構(添加/洗掉/修改 新的屬性/方法)
優勢:比反射開銷小,性能高
常見的位元組碼操作類別庫:1.BCEL,2.ASM,3.CGLIB,4.JAVASSIT
javassist的最外層的api和java反射包中的api相似
主要由CtClass,CtMethod,以及CtField幾個類組成,
用于執行和jdk反射api中java.lang,Class,java.lang,Method,java.lang,reflect.Method.Field相同的操作
1.使用ssist庫創建一個全新的類
2.使用XJAD反編譯工具,將生成的class檔案反編譯成JAVA檔案

4.javassist常見api

5.javassist的局限性
jdk5的新語法不支持(包括泛型、列舉),不支持注解修改,但可以通過底層javassist類來解決
不支持陣列的而初始化,除非陣列的容量為1
不支持內部類和匿名類
不支持continue和break運算式
對于繼承關系有些不支持
例:
class A{}
class B extends A{}
class C extends B{}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110717.html
標籤:Java
上一篇:Apache DolphinScheduler 誕生記
下一篇:Java只有中國開發者在用了嗎?
