关于java内部类-java开发java经验技巧

关于java内部类-java开发java经验技巧

ID:32832472

大小:63.70 KB

页数:4页

时间:2019-02-16

关于java内部类-java开发java经验技巧_第1页
关于java内部类-java开发java经验技巧_第2页
关于java内部类-java开发java经验技巧_第3页
关于java内部类-java开发java经验技巧_第4页
资源描述:

《关于java内部类-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、关于Java内部类-编程开发技术关于Java内部类木文由ImportNew・陈秋林翻译自javacodegeekso欢迎加入翻译小组。转载请见文末要求。J2V3中可以定义成员内部类(在另一个类里面定义的类),局部内部类(在语句块屮定义的类)和匿名内部类(没冇名字的类):classOuter{Objectanonymous二newObject(){};//这是一个匿名类//匿名初始化{//这是一个Local类classLocal{}Local1=newLocal();}Outer(){//这是构造函数中的Local类classLocal{}Local1=newL

2、ocal();}voidmethod(){//这是方法中的Local类classLocal{}Local1=newLocal();}//这是一个成员类classInner{}Inneri二newInner();}Java语言规范将成员类,木地类和匿名类统称为内部类。实现“细节”Java语言规范和虚拟机规范并没有告诉我们内部类的实现细节。这里的一些文章阐明了一些细节,比如Java编译器如何生成合成方法,可以使这些成员类访问(外部类的)私有成员,这在JVM中本来是是不允许的。很容易知道内部类的另一个实现细节:内部类的构造函数需耍额外的合成参数。内部类构造函数第一个

3、合成参数就是普遍知道的内部类的外围实例(的引用),它存储在this$O?的合成域小。?这是适用于三种内部类:成员,本地和匿名。但鲜为人知的是,局部内部类需要通过额外的合成构造参数来获取非常量变量,(获取常量将被内联,并不会产生额外的合成构造函数参数):classOuter{voidmethod(){finalStringconstant二〃foo〃;finalStringnonConstant=,zfoo,z.toUpperCase();classLocal{/**syntheticfieldsandconstruetor:**Outerthis$0;Stri

4、ngnonConstant;**Local(Outerthis$0,StringnonConstant){this.this$0二this$0;*this.nonConstant二nonConstant;}*/}Local1二newLocal();}好吧,但是我为什么要关心它?在大多数情况下,你并不关心内部类的实现机制,除非好奇心使然。但是如果你在内部类中使用了反射,这里有些东西你需要清楚,而且我并没冇听过或者在网上看过这类资料,所以我想很有必要列出清单帮助其他人弄清楚,因为通过Java反射的API,不同的编译器会产生不同的结果。现在的问题是,当你使用Java

5、反射来获取对内部类构造一个java.lang,reflect.Constructor屮的实例会发生什么情况,尤其是使用那些允许你访问参数类型(pre-generics:getParameterTypes()),泛型参数类型(post-gcncries:?gctGcncricParamctcrTypcs())和注释(getParameterAnnotations())?答案是:这取决于不同的编译器。假设有一个类:classOuter{classInner{Inner(){}Inner(Stringparam){}Inner(©DeprecatedIntegerp

6、aram){}}它们会因为java编译下面是这三个通过反射调用构造函数得到的数组的长度,器的不同而不同。Outer.Inner.class>getDeclaredConstruetor()Outer.Inner.class.getDeclaredConstructor(Outer.Inner.class.getDeclaredConstructor(String,class)Integer,class)22122211gctParamctcrT^^pcs()•lengthgetGenericParameterTypes()•length?compiledwit

7、hEclipsegetGenericParameterTypes()•length?compiledwithJavacgetParameterAnnotations()•length可以看到,getParamcterTypes()中始终包含“合成”参数,但是在getGenericParameterTypes()屮,只有用Eclipse编译时才包含“合成”参数;而对于getParameterAnnotations(),除非你的构造函数的参数使用了注释,否则也一直包含了“合成”参数。通过这些信息,你可以了解到这三个方法产生的不同结果,但是到目前为止我还是没有办法确

8、定一个参数是否是“合成”的,因为虽然你

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。