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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数

發布時間:2023/12/3 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java構造函數內部調用

關于Java內部類

Java允許成員類(在其他類內定義的類),局部類(在語句塊內定義的類)和匿名類(無名稱的類):



class Outer {Object anonymous = new Object(){}; // this is an anonymous class// anonymous initialisation block{// this is a local classclass Local{}Local l = new Local();}Outer() {// this is a local named class in a constructorclass Local{}Local l = new Local();}void method() {// this is a local named class in a methodclass Local{}Local l = new Local();}// this is a member classclass Inner{}Inner i = new Inner(); }

Java語言規范將成員,本地和匿名類分類為內部類 。

實施“細節”

Java語言或虛擬機規范沒有告訴您的是它們是如何實現的。 其他文章已經對此進行了解釋,例如Java編譯器如何生成綜合方法以允許這些成員類訪問私有字段,而JVM不允許這樣做。

內部類的另一個易于實現的實現細節是內部類的構造函數采用了額外的綜合參數。 相對眾所周知 ,內部類構造函數的第一個綜合參數將是其封閉實例,并將其存儲在this$X綜合字段中。 這對所有三種內部類均有效:成員,本地和匿名。

但是通常不知道捕獲非恒定最終變量的局部類是否要求將所有這些變量作為額外的綜合構造函數參數傳遞(捕獲的常數最終變量將被內聯并且不會生成額外的綜合構造函數參數):

class Outer {void method() {final String constant = "foo";final String nonConstant = "foo".toUpperCase();class Local{/* synthetic fields and constructor:Outer this$0;String nonConstant;Local(Outer this$0, String nonConstant){this.this$0 = this$0;this.nonConstant = nonConstant;}*/}Local l = new Local();} }

好的,但是我為什么要關心呢?

在大多數情況下,除了您自己的好奇心之外,您根本不在乎。 但是,如果您正在使用內部類進行Java反射,那么您應該了解一些事情,并且由于我沒有在網上找到或列出它們,因此我認為重要的是要列出幫助他人了解的事情因為不同的編譯器將在Java Reflection API中產生不同的結果。

問題是,當您使用Java反射為內部類構造函數獲取java.lang.reflect.Constructor實例時會發生什么? 特別是,允許??您訪問參數類型(前泛型: getParameterTypes() ),泛型參數類型(后泛型: getGenericParameterTypes() )和注釋( getParameterAnnotations() )以及答案的方法會發生什么?是: 這取決于 。

假設以下Java類:

class Outer {class Inner {Inner(){}Inner(String param){}Inner(@Deprecated Integer param){}} }

這是我們的每個構造函數上這三種反射方法返回的數組的大小,以及它們根據所使用的Java編譯器的不同而有所不同:

外層內部類
.getDeclaredConstructor() 外層內部類
.getDeclaredConstructor(
String.class) 外層內部類
.getDeclaredConstructor(
Integer.class)
getParameterTypes()
。長度
1個 2 2
getGenericParameterTypes()
.length用Eclipse編譯
1個 2 2
getGenericParameterTypes()
.length用Javac編譯
0 1個 1個
getParameterAnnotations()
。長度
1個 2 1個

如您所見,合成參數始終包含在getParameterTypes() ,但僅在使用Eclipse進行編譯時才包含在getGenericParameterTypes() 。

另一方面, getParameterAnnotations()將始終包含合成參數,除非注釋了至少一個構造函數參數。

通過此信息,您現在了解了這些方法的結果之間的差異,但是到目前為止,我仍然沒有找到確定哪個參數是合成參數的方法,因為盡管您可以對this$X合成做出很好的猜測參數,這是每個內部類都需要的,因此您無法知道將捕獲為局部類構造函數的綜合參數的非常量捕獲變量的數量。

參考: Ceylon Team博客博客中的JCG合作伙伴 Stef Epardaud提供的帶有內部類構造函數參數的Java Reflection奇數。

翻譯自: https://www.javacodegeeks.com/2013/05/java-reflection-oddities-with-inner-class-constructor-parameters.html

java構造函數內部調用

總結

以上是生活随笔為你收集整理的java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。