JAVA15.JDK15.7 HiddenClass
第七講 HiddenClass
視頻課:https://edu.csdn.net/lecturer/1516
JEP 371:Hidden Classes(隱藏類)
? 該提案通過啟用標(biāo)準(zhǔn) API 來定義無法發(fā)現(xiàn)且具有有限生命周期的隱藏類,從而提高 JVM 上所有語言的效率。JDK內(nèi)部和外部的框架將能夠動態(tài)生成類,而這些類可以定義隱藏類。通常來說基于JVM的很多語言都有動態(tài)生成類的機制,這樣可以提高語言的靈活性和效率。
- 隱藏類天生為框架設(shè)計的,在運行時生成內(nèi)部的class。
- 隱藏類只能通過反射訪問,不能直接被其他類的字節(jié)碼訪問。
- 隱藏類可以獨立于其他類加載、卸載,這可以減少框架的內(nèi)存占用。
一.概念
? 不能直接被其他class的二進制代碼使用的class。Hidden Classes主要被一些框架用來生成運行時類,但是這些類不是被用來直接使用的,而是通過反射機制來調(diào)用。
? 比如在JDK8中引入的lambda表達式,JVM并不會在編譯的時候?qū)ambda表達式轉(zhuǎn)換成為專門的類,而是在運行時將相應(yīng)的字節(jié)碼動態(tài)生成相應(yīng)的類對象。
二.為什么要用
? 如果標(biāo)準(zhǔn)API可以定義隱藏的不可發(fā)現(xiàn)且生命周期有限的類,那么動態(tài)生成類的JDK內(nèi)外的框架可以定義隱藏類。JavaScript引擎可以為JavaScript程序翻譯的字節(jié)碼生成隱藏類,因為知道當(dāng)引擎不再使用這些類時,這些類將被卸載。靈活性、安全性,保證這兩點,框架基礎(chǔ)實現(xiàn)。
舉栗子:
public class HiddenTest {public static void main(String[] args) {Runnable runnable=()->{System.out.println("JDK15測試");};} }反編譯:
public class HiddenTest {public HiddenTest() {}public static void main(String[] args) {Runnable runnable = () -> {System.out.println("JDK15測試");};} }JClassLib截圖:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-krbIuZMS-1607086350659)(E:\Java15新特性\assets\image-20201201232359801.png)]
invokedynamic:運行時動態(tài)解析調(diào)用的類;
invokevirtual:調(diào)用實例方法
三.特性和支持
3.1 動態(tài)生成類特性
- 不可發(fā)現(xiàn)性。因為我們是為某些靜態(tài)的類動態(tài)生成的動態(tài)類,所以我們希望把這個動態(tài)生成的類看做是靜態(tài)類的一部分。所以我們不希望除了該靜態(tài)類之外的其他機制發(fā)現(xiàn)。
- 訪問控制。我們希望在訪問控制靜態(tài)類的同時,也能控制到動態(tài)生成的類。
- 生命周期。動態(tài)生成類的生命周期一般都比較短,我們并不需要將其保存和靜態(tài)類的生命周期一致。
API的支持
所以我們需要一些API來定義無法發(fā)現(xiàn)的且具有有限生命周期的隱藏類。這將提高所有基于JVM的語言實現(xiàn)的效率。
比如:
java.lang.reflect.Proxy可以定義隱藏類作為實現(xiàn)代理接口的代理類。
java.lang.invoke.StringConcatFactory可以生成隱藏類來保存常量連接方法;
java.lang.invoke.LambdaMetaFactory可以生成隱藏的nestmate類,以容納訪問封閉變量的lambda主體;
java.lang.invoke.LambdaMetaFactory可以生成隱藏的nestmate類,以容納訪問封閉變量的lambda主體;
? 普通類是通過調(diào)用ClassLoader::defineClass創(chuàng)建的,而隱藏類是通過調(diào)用Lookup::defineHiddenClass創(chuàng)建的。這使JVM從提供的字節(jié)中派生一個隱藏類,鏈接該隱藏類,并返回提供對隱藏類的反射訪問的查找對象。調(diào)用程序可以通過返回的查找對象來獲取隱藏類的Class對象。
總結(jié)
以上是生活随笔為你收集整理的JAVA15.JDK15.7 HiddenClass的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA15.JDK15.6 Recor
- 下一篇: 区块链中的数学 - EdDSA签名机制