java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数
java構(gòu)造函數(shù)內(nèi)部調(diào)用
關(guān)于Java內(nèi)部類
Java允許成員類(在其他類內(nèi)定義的類),局部類(在語(yǔ)句塊內(nèi)定義的類)和匿名類(無(wú)名稱的類):
Java語(yǔ)言規(guī)范將成員,本地和匿名類分類為內(nèi)部類 。
實(shí)施“細(xì)節(jié)”
Java語(yǔ)言或虛擬機(jī)規(guī)范沒(méi)有告訴您的是它們是如何實(shí)現(xiàn)的。 其他文章已經(jīng)對(duì)此進(jìn)行了解釋,例如Java編譯器如何生成綜合方法以允許這些成員類訪問(wèn)私有字段,而JVM不允許這樣做。
內(nèi)部類的另一個(gè)易于實(shí)現(xiàn)的實(shí)現(xiàn)細(xì)節(jié)是內(nèi)部類的構(gòu)造函數(shù)采用了額外的綜合參數(shù)。 相對(duì)眾所周知 ,內(nèi)部類構(gòu)造函數(shù)的第一個(gè)綜合參數(shù)將是其封閉實(shí)例,并將其存儲(chǔ)在this$X綜合字段中。 這對(duì)所有三種內(nèi)部類均有效:成員,本地和匿名。
但是通常不知道捕獲非恒定最終變量的局部類是否要求將所有這些變量作為額外的綜合構(gòu)造函數(shù)參數(shù)傳遞(捕獲的常數(shù)最終變量將被內(nèi)聯(lián)并且不會(huì)生成額外的綜合構(gòu)造函數(shù)參數(shù)):
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();} }好的,但是我為什么要關(guān)心呢?
在大多數(shù)情況下,除了您自己的好奇心之外,您根本不在乎。 但是,如果您正在使用內(nèi)部類進(jìn)行Java反射,那么您應(yīng)該了解一些事情,并且由于我沒(méi)有在網(wǎng)上找到或列出它們,因此我認(rèn)為重要的是要列出幫助他人了解的事情因?yàn)椴煌木幾g器將在Java Reflection API中產(chǎn)生不同的結(jié)果。
問(wèn)題是,當(dāng)您使用Java反射為內(nèi)部類構(gòu)造函數(shù)獲取java.lang.reflect.Constructor實(shí)例時(shí)會(huì)發(fā)生什么? 特別是,允許??您訪問(wèn)參數(shù)類型(前泛型: getParameterTypes() ),泛型參數(shù)類型(后泛型: getGenericParameterTypes() )和注釋( getParameterAnnotations() )以及答案的方法會(huì)發(fā)生什么?是: 這取決于 。
假設(shè)以下Java類:
class Outer {class Inner {Inner(){}Inner(String param){}Inner(@Deprecated Integer param){}} }這是我們的每個(gè)構(gòu)造函數(shù)上這三種反射方法返回的數(shù)組的大小,以及它們根據(jù)所使用的Java編譯器的不同而有所不同:
| getParameterTypes() 。長(zhǎng)度 | 1個(gè) | 2 | 2 | 
| getGenericParameterTypes() .length用Eclipse編譯 | 1個(gè) | 2 | 2 | 
| getGenericParameterTypes() .length用Javac編譯 | 0 | 1個(gè) | 1個(gè) | 
| getParameterAnnotations() 。長(zhǎng)度 | 1個(gè) | 2 | 1個(gè) | 
如您所見(jiàn),合成參數(shù)始終包含在getParameterTypes() ,但僅在使用Eclipse進(jìn)行編譯時(shí)才包含在getGenericParameterTypes() 。
另一方面, getParameterAnnotations()將始終包含合成參數(shù),除非注釋了至少一個(gè)構(gòu)造函數(shù)參數(shù)。
通過(guò)此信息,您現(xiàn)在了解了這些方法的結(jié)果之間的差異,但是到目前為止,我仍然沒(méi)有找到確定哪個(gè)參數(shù)是合成參數(shù)的方法,因?yàn)楸M管您可以對(duì)this$X合成做出很好的猜測(cè)參數(shù),這是每個(gè)內(nèi)部類都需要的,因此您無(wú)法知道將捕獲為局部類構(gòu)造函數(shù)的綜合參數(shù)的非常量捕獲變量的數(shù)量。
參考: Ceylon Team博客博客中的JCG合作伙伴 Stef Epardaud提供的帶有內(nèi)部類構(gòu)造函數(shù)參數(shù)的Java Reflection奇數(shù)。翻譯自: https://www.javacodegeeks.com/2013/05/java-reflection-oddities-with-inner-class-constructor-parameters.html
java構(gòu)造函數(shù)內(nèi)部調(diào)用
總結(jié)
以上是生活随笔為你收集整理的java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 江德福最后什么级别(父母爱情江德福最后什
- 下一篇: 怎样清理手机喇叭灰尘(怎么才能清理手机喇
