精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

優于反射(Reflection):在Java中使用方法句柄和變量句柄

譯文 精選
開發 前端
反射多年來一直是高級Java工具包的關鍵。現在,它正在被更先進、更安全的選項所取代。下文介紹了如何使用MethodHandle和VarHandle來獲得對方法和字段的編程訪問。

譯者 | 晶顏

審校 | 重樓

區分資深Java開發人員的因素之一是熟悉反射(reflection)及其先進替代品。反射為Java開發提供了超能力,但它很麻煩,容易出錯,并且存在性能瓶頸。現代Java正在努力用標準化的選項取代反射,包括方法句柄(MethodHandle變量句柄(VarHandle。與反射一樣,這些類也允許你訪問對象上的方法和字段,但使用的是更清晰的API。

句柄的力量

顧名思義,MethodHandle和VarHandle都為你提供了句柄,它們是引用對象元屬性的變量。這些句柄使你能夠直接處理方法和字段。它們是特殊的變量,引用運行時環境的某些部分,否則將對代碼隱藏。

這些功能的起點是MethodHandle上的各種查找方法,這些方法提供了一種以編程方式查找類元數據的現代方法。這類似于舊的反射API的方法,如getDeclaredMethod,但具有更多的結構和安全性。

一旦有了類元數據的句柄,就可以使用MethodHandle和VarHandle以編程方式對類實例上存在的方法和字段進行調用。在底層,JVM管理這些方法,通常比使用反射獲得更好的性能。

方法和變量句柄 VS. Java反射

要真正理解MethodHandles和Varhandles——它們是做什么的以及它們為什么有用——了解一些關于Java反射的知識是有幫助的。這將幫助你理解為什么反射會演變成這些較新的API。

最根本的問題是這些技術——反射、方法句柄、變量句柄——需要滿足什么需求當我們可以簡單地實例化一個對象,調用它的公共方法并訪問它的公共成員時,我們為什么要用編程的方式來做這些事情呢

在很多情況下,不能通過公共方法訪問需要的程序,所以必須繞過正常的路線。這主要發生在你編寫類似框架代碼時,該代碼對一系列類進行操作并對它們進行非標準操作。

以一個持久性框架為例,你需要將類映射到表和表之間,因此你需要內省(Introspect)類以了解它們具有哪些字段和方法。這種情況也會出現在應用程序代碼中,特別是當你需要訪問遺留庫中無法訪問的部分時。

決定使用哪種技術要了解需要什么。如果你可以使用普通的Java調用來解決這個問題,那么就是可行的方法。如果需要更復雜的東西,先看看標準的API(比如MethodHandles和VarHandles。只有當這些都無法實現時,才應該轉而依靠反射

下述示例可以幫助你理解為什么JAVA開發工具包(JDK)更喜歡句柄而傳統的Java反射。

使用反射來訪問方法

我們將從一個反射示例開始,因為它很常見,并且會給我們一個已知的參考。請記住,這是最后的解決方案。

假設有這個類:

public class MyClass {
 private String name;
 public MyClass(String name) {
 this.name = name;
 }
 public String getName() { 
 return name;
 }
}

這是一個非常簡單的事情只是一個用于保存字符串名的類。要創建這個類,我們可以使用普通實例化

MyClass objectInstance = new MyClass("John Doe");

下面是使用反射訪問該方法的示例:

Class<?> clazz = objectInstance.getClass();
Method method = clazz3.getDeclaredMethod("getName");
String value = (String) method.invoke(objectInstance);
System.out.println(value); // prints "John Doe"

使用MethodHandles來訪問方法

方法句柄為我們提供了與反射相同的功能,但語法更安全

Class<?> clazz = objectInstance.getClass(); 
MethodHandle handle = MethodHandles.lookup().findVirtual(clazz, "getName", methodType(String.class));
String value = (String) handle.invoke(objectInstance);
System.out.println(value); // Prints “John Doe”

我們以同樣的方式開始,從實例中獲取類。然后,我們在MethodHandles上使用lookup(). findvirtual()方法。這是MethodHandles設計的主要目的之一提供一種更簡潔、JDK認可的方法來查找方法。這種方法還針對JVM優化進行了增強。

接下來,我們將使用handle.invoke調用帶有句柄的方法并傳入對象實例。

直接訪問字段

假設我們之前的類MyClass上面有name字段但沒有訪問器。我們現在需要更強的程序來訪問它,因為我們要直接訪問私有成員(Private Member)。下面是我們使用標準反射的方法

Class<?> clazz = objectInstance.getClass(); 
Field field = clazz.getDeclaredField("name"); 
field.setAccessible(true); 
String value = (String) field.get(objectInstance);
System.out.println(value); // prints “John Doe”

注意,我們再次直接處理對象的元數據,比如它的類和它的字段。我們可以使用setAccessible操作字段的可訪問性這被認為是有風險的,因為它可能會改變目標代碼所寫的限制。這是使私有字段對我們可見的關鍵部分。

現在讓我們使用變量句柄做同樣的事情

Class<?>l clazz = objectInstance.getClass();
VarHandle handle = MethodHandles.privateLookupIn(clazz, 
 MethodHandles.lookup()).findVarHandle(clazz, "name", String.class);
String value = (String) handle.get(objectInstance);
System.out.println(value4); // prints "John Doe"

這里,我們使用privateLookupIn,因為該字段被標記為私有Private。還有一個通用lookup(),它將尊重訪問修飾符,因此它更安全,但不會找到私有字段。

雖然上面的代碼可以運行,但出于性能原因,建議靜態地實例化句柄本身,如下所示

private static VarHandle HANDLE;
 static {
 try {
 HANDLE = MethodHandles.privateLookupIn(MyClass.class, MethodHandles.lookup()).findVarHandle(MyClass.class, "name", String.class);
 } catch (Throwable t){
 throw new RuntimeException(t);
 }
 }

// …

System.out.println("static: " + HANDLE.get(objectInstance));

這里,我們靜態地實例化了HANDLE變量,然后在稍后的正常代碼流中使用它。這也突出了句柄本身是為類型MyClass定義的,然后為實例(ObjectInstance重用。

注意,直接實例化句柄需要知道類的名稱。如果你不知道類的名稱,則不能使用這種方法。

方法和變量句柄的限制

盡管它們為標準化的JDK帶來了強大的功能,但方法句柄和變量句柄并不打算涵蓋Java反射API中的所有功能。它們只是涵蓋了一個重點范圍查找類元數據并使用它來訪問常規Java限制之外的方法和字段。其余sun.misc. Unsafe中的反射力量正逐漸被其他包所取代。

如前所述,MethodHandles和VarHandle不支持實例化類,這在某些情況下會產生限制。

是時候思考反射替代方案了

花點時間說服自己遠離反射是必要的,也是值得的。如果你研究了基準測試,就會發現方法句柄和變量句柄的性能普遍優于反射。另一方面,它們更安全、更地道,并且JVM代碼庫正在采用這些方法它們的普及也只是時間問題而已

在基準測試中,靜態聲明句柄可以顯著提高性能。這是因為JVM可以在編譯時內聯這些信息。但是,如前所述,這樣做并總是可——例如,如果你在編譯時不知道類的名稱。

除了性能之外,基于正確性等因素考慮,反射也正逐漸被棄用。最終,無論如何都需要遷移工作。現在是時候開始移動代碼庫中那些具有現代替代品如MethodHandles和VarHandle的部分了!

原文標題:Better than reflection: Using method handles and variable handles in Java,作者:Matthew Tyson

責任編輯:華軒 來源: 51CTO
相關推薦

2023-01-28 17:41:07

Java代碼

2024-04-10 09:08:05

WPFWinForms.NET

2009-06-17 13:57:54

java實例Reflection

2011-05-17 16:20:46

C++

2011-03-30 10:41:11

C++數據庫

2011-09-02 19:24:20

SqliteIOS應用數據庫

2010-08-11 09:40:44

LINQ

2010-07-14 15:23:19

Perl文件句柄

2015-04-17 16:44:22

swiftOC

2014-07-28 10:00:47

linux系統調試句柄

2011-04-08 10:43:44

2009-09-15 17:46:08

C#綁定句柄無效

2021-03-18 10:14:06

Python工具代碼

2010-07-15 14:01:10

Perl目錄句柄

2021-01-27 10:56:05

Linux運維Linux系統

2009-06-24 10:49:08

Unix

2009-12-01 17:00:49

PHP變量

2023-05-04 07:33:39

Rust變量常量

2024-09-18 00:00:02

反射C#元數據

2013-07-15 15:12:40

iOS多線程NSOperationNSOperation
點贊
收藏

51CTO技術棧公眾號

秋霞影院一区二区| 一道本一区二区三区| 亚洲精品你懂的| 91精品在线国产| 日韩少妇裸体做爰视频| 久久最新网址| 欧美大片一区二区| 欧美成人黑人猛交| 制服丝袜中文字幕在线| 99riav一区二区三区| 91精品视频免费看| 亚洲黄色免费观看| 仙踪林久久久久久久999| 日韩电影在线观看中文字幕 | 老牛影视一区二区三区| 久久九九亚洲综合| 91网站免费视频| 97久久亚洲| 欧美视频一区在线| 中国丰满人妻videoshd| 丝袜美腿av在线| 中文字幕+乱码+中文字幕一区| 国产欧美欧洲| 99国产精品久久久久99打野战| 首页综合国产亚洲丝袜| 久久噜噜噜精品国产亚洲综合| 男女全黄做爰文章| 国产成人精品三级高清久久91| 精品免费视频一区二区| 在线观看亚洲色图| 欧美色999| 亚洲国产综合91精品麻豆| 中文字幕日韩精品久久| 黄色av免费在线观看| 99久久99久久精品国产片果冻| 91色中文字幕| 国产精品嫩草影院精东| 麻豆一区二区99久久久久| 欧美伊久线香蕉线新在线| 久草福利资源在线观看| 香蕉综合视频| 久久夜色精品国产欧美乱| 天堂资源在线视频| 日本电影一区二区| 亚洲人成网在线播放| 丰满少妇一区二区三区| 日韩啪啪网站| 日韩大片免费观看视频播放| 超碰97在线资源站| 日韩高清电影免费| 国产视频欧美视频| 免费看黄色的视频| 国产探花一区| 一区二区三区四区在线观看视频| 国产人妻一区二区| 欧洲毛片在线视频免费观看| 中文在线不卡视频| 高清国产在线观看| 99久久婷婷| 麻豆乱码国产一区二区三区| 午夜精品一区二区三级视频| 国产精品国产一区| 欧美猛交ⅹxxx乱大交视频| 中文字幕影音先锋| 亚洲激情网站| 欧美自拍大量在线观看| 欧美一区免费看| 免费观看成人av| 亚洲在线观看视频| 少妇又色又爽又黄的视频| av欧美精品.com| 欧美二区三区| 亚洲1卡2卡3卡4卡乱码精品| 亚洲欧美国产高清| 妞干网在线观看视频| 中文在线аv在线| 欧美日韩极品在线观看一区| 国产不卡的av| 亚洲宅男一区| 精品国产拍在线观看| 久久久香蕉视频| 日韩avvvv在线播放| 91精品视频免费看| 天天综合永久入口| 国产精品麻豆一区二区 | 亚洲欧洲视频| 国产精品久久久久久久久久三级 | 日韩av在线精品| 欧美成人久久久免费播放| 欧美日韩免费| 国产精品久久999| 亚洲成人中文字幕在线| 国产亚洲欧洲一区高清在线观看| 超碰97免费观看| 欧美13videosex性极品| 欧美日韩成人综合天天影院 | 97视频在线观看视频免费视频| 无码人妻精品一区二区三区不卡| 国产一区二区在线看| 免费看成人午夜电影| 欧美jizz18hd性欧美| 欧美日韩国产在线| 色黄视频免费看| 视频精品在线观看| 久久久久久久久久国产| 亚洲资源在线播放| 91网站在线观看视频| 亚洲美女自拍偷拍| 播放一区二区| 亚洲精品videossex少妇| 看黄色录像一级片| 麻豆久久婷婷| 国产亚洲福利社区| 羞羞视频在线免费国产| 欧美午夜理伦三级在线观看| 久久久午夜精品福利内容| 天天影视天天精品| 国产精品白嫩初高中害羞小美女 | 日韩在线精品强乱中文字幕| 在线亚洲欧美视频| 成年人视频在线免费看| 成人国产免费视频| 日韩人妻精品一区二区三区| 电影一区二区| 亚洲人成电影在线播放| 国产情侣在线视频| av一本久道久久综合久久鬼色| 懂色av粉嫩av蜜臀av| 欧美激情福利| 色yeye香蕉凹凸一区二区av| 伊人久久久久久久久久久久 | 日韩欧美国产一区在线观看| 麻豆网址在线观看| 久久精品国内一区二区三区| 欧美中日韩一区二区三区| 免费看男女www网站入口在线| 欧美成人精品高清在线播放| 福利所第一导航| 国产精品一二三四五| 中文字幕在线观看一区二区三区| 精品123区| 中文字幕av一区二区| 中文字幕人妻一区二区三区视频 | 日韩国产精品视频| 国产黄色片免费看| 91在线你懂得| 国产无套内射久久久国产| 妖精视频一区二区三区| 亲爱的老师9免费观看全集电视剧| 三级理论午夜在线观看| 色综合咪咪久久| 蜜桃传媒一区二区亚洲| 蜜臀久久久99精品久久久久久| 三区精品视频| 玖玖精品在线| 欧美久久精品一级黑人c片| 精品国产av 无码一区二区三区| 亚洲女人****多毛耸耸8| 毛毛毛毛毛毛毛片123| 国产主播一区| 久久人人97超碰人人澡爱香蕉| 在线免费看h| 中文字幕av一区| 国产国语亲子伦亲子| 亚洲夂夂婷婷色拍ww47| 久久偷拍免费视频| 青青草国产成人99久久| 免费看av软件| 黄色美女久久久| 国产成人亚洲综合91精品| 日本免费在线观看| 精品国产制服丝袜高跟| 久久精品国产成人av| 中文字幕av一区 二区| 欧美污在线观看| 9国产精品视频| 亚洲精品二区| 一区视频网站| 欧美在线性爱视频| 免费在线你懂的| 亚洲福利在线观看| 自拍偷拍精品视频| 亚洲一区在线观看免费观看电影高清 | 一本久道久久综合狠狠爱亚洲精品| a一区二区三区亚洲| 97视频在线观看播放| 午夜国产福利在线| 日韩高清中文字幕| 国产suv精品一区二区69| 欧美性xxxx极品高清hd直播| 在线视频这里只有精品| 99久久婷婷国产| 91小视频在线播放| 国产欧美午夜| 天天在线免费视频| 精品视频亚洲| 国产精品制服诱惑| 亚洲伊人伊成久久人综合网| 欧美亚洲日本黄色| 青青草原av在线| 中文日韩在线视频| 欧美老女人性开放| 精品免费视频.| 97久久人国产精品婷婷 | 亚洲天堂aaa| 欧美日韩免费在线观看| 久久久精品视频免费观看| 国产视频视频一区| 亚洲一区二区三区四区五区六区| 狠狠色丁香久久婷婷综| 国内外免费激情视频| 亚洲一级二级| 加勒比海盗1在线观看免费国语版| 精品香蕉视频| 欧美一区亚洲二区| 日本亚洲不卡| 国产精品v欧美精品v日韩| 激情中国色综合| 国产成人精品在线| 欧美三级网站| 91精品国产色综合久久不卡98| h视频在线免费观看| 日韩视频中文字幕| youjizz在线播放| 亚洲欧洲xxxx| 色鬼7777久久| 国产丝袜一区二区三区免费视频| 亚洲免费一级片| 日韩欧美一卡二卡| 国产深喉视频一区二区| 欧美高清视频一二三区 | 在线观看视频99| 国产黄色在线播放| 亚洲欧洲第一视频| 国产视频网站在线| 国产一区二区精品丝袜| 成人在线免费公开观看视频| 亚洲人av在线影院| 黄色大片在线免费观看| 在线免费看av不卡| melody高清在线观看| 永久免费看mv网站入口亚洲| 欧美日韩国产中文字幕在线| 亚洲欧美日韩视频一区| 国产午夜精品一区理论片| 亚洲男人av电影| 国产永久av在线| 色偷偷av一区二区三区乱| 亚洲成人三级| 免费av一区二区| 欧美24videosex性欧美| 国模吧一区二区| 人成在线免费网站| 国产成人精品视频在线观看| 精品国产欧美日韩一区二区三区| 无码人妻丰满熟妇奶水区码| 日韩精品欧美大片| 国产精品美女黄网| 久久精品国产亚洲5555| 久久综合一区二区三区| 精品国产一区二区三区噜噜噜| 日本精品二区| 围产精品久久久久久久| a级黄色片免费| 亚洲精品专区| 四季av一区二区| 国产制服丝袜一区| 亚洲女则毛耸耸bbw| 久久亚洲精品小早川怜子| 成人黄色免费网址| 亚洲人成人一区二区在线观看 | 日本午夜在线| 中文字幕精品视频| 亚洲精品白浆| 国产成人精品av在线| 伊人久久一区| 精品日本一区二区三区在线观看 | 91亚洲大成网污www| 日韩免费成人av| 玉米视频成人免费看| 看片网址国产福利av中文字幕| 欧美中文字幕亚洲一区二区va在线 | 中文字幕资源站| 亚洲国产日韩a在线播放| 无码免费一区二区三区| 日韩三级电影网址| 国产在线观看精品一区| 久久91超碰青草是什么| 欧美7777| 高清视频在线观看一区| 精品国产一区探花在线观看| 免费网站在线观看视频| 日韩高清不卡一区二区三区| 亚洲乱妇老熟女爽到高潮的片| 国产日韩欧美在线一区| 青青草原在线免费观看视频| 日本电影亚洲天堂一区| 亚洲乱色熟女一区二区三区| 亚洲人成绝费网站色www| 成人爽a毛片免费啪啪动漫| 国产欧美一区二区三区在线看| 精品亚洲免a| 99热都是精品| 日本不卡的三区四区五区| 亚洲激情 欧美| 亚洲免费视频成人| 波多野结衣在线观看视频| 亚洲精品久久久久久久久久久久| 免费av网站在线看| 日韩美女福利视频| 久久综合社区| 僵尸世界大战2 在线播放| 国产综合一区二区| 天天摸日日摸狠狠添| 欧美性xxxxhd| 五月婷婷六月丁香| 欧美激情二区三区| 成人久久精品| 亚洲精品视频一二三| 丝袜亚洲另类欧美| 亚洲一区二区三区无码久久| 亚洲午夜三级在线| 午夜精品小视频| 美日韩在线视频| 伊人久久大香伊蕉在人线观看热v| 四虎影院一区二区三区 | 青青草原播放器| 国产精品久久久久一区| 成人午夜精品视频| 亚洲人成网站777色婷婷| 天堂av在线网| 精品一区在线播放| 国产精品久久久久久模特| 亚洲高清无码久久| 精品国产91久久久久久老师| 男人天堂手机在线观看| 久久久久久91| 精品国内亚洲2022精品成人| 国产男女免费视频| 成人av电影免费在线播放| 日产精品久久久久| 亚洲激情免费观看| 成人美女大片| 日韩欧美99| 蜜桃精品视频在线| 亚洲AV成人无码精电影在线| 欧美精品在线视频| 麻豆av免费在线观看| 92看片淫黄大片欧美看国产片| 欧美一区高清| 农村末发育av片一区二区 | 久久精品91久久久久久再现| 日韩福利影视| 成人国产在线看| 成人av电影在线播放| 麻豆成人免费视频| 在线a欧美视频| 国产精品一区免费在线 | 嫩草伊人久久精品少妇av杨幂| 色就是色欧美| 国产在线乱码一区二区三区| 久久免费视频99| 精品亚洲aⅴ在线观看| jizzjizz少妇亚洲水多| 色爽爽爽爽爽爽爽爽| 成人a区在线观看| 一二三区免费视频| 久久精品国产一区二区电影| 中文字幕区一区二区三| 大陆极品少妇内射aaaaa| 中文字幕乱码一区二区免费| 91久久精品无码一区二区| 欧美激情小视频| 九一成人免费视频| 三级性生活视频| 精品久久久久久国产91| av免费观看一区二区| yy111111少妇影院日韩夜片 | 国产成人自拍视频在线观看| 99精品视频在线| 无码精品一区二区三区在线播放| 91精品办公室少妇高潮对白| 超碰在线网址| 明星裸体视频一区二区| 国产激情偷乱视频一区二区三区| 国产精品视频久久久久久久| 久久精品成人一区二区三区| 国产伦精品一区二区三区在线播放 | 视频一区二区视频| 91美女在线观看| av中文字幕观看| 国产精欧美一区二区三区| 欧美午夜免费影院| av在线播放中文字幕| 亚洲精品美女久久| 99视频这里有精品| www日韩在线观看| 亚洲综合无码一区二区| gogogo高清在线观看免费完整版| 国产精品自拍首页|