日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA15.JDK15.7 HiddenClass

發(fā)布時間:2024/1/23 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA15.JDK15.7 HiddenClass 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第七講 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表達(dá)式,JVM并不會在編譯的時候?qū)ambda表達(dá)式轉(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。