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构造函数内部调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的新视差控件(JavaFX)

介绍 视差是一种视觉效果,您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下,当您在道路上行驶时,您会看到附近的树木在快速移动,而距离较远的树木将沿相同的方向移动,但速度较慢,结果是您感…

ajax提交file空指针,excel导入上传文件报空指针错误

页面入口全选导入导出${msg[globals.button.delete.more]}导出jsfunction excelImport() {top.layer.open({type: 1,area: [500, 300],title:"导入数据",content:$("#importBox").html() ,btn: [下载模板,确定, 关闭],btn1: function(index, layero){windo…

mockito 静态方法_Mockito –带有注释和静态方法的额外接口

mockito 静态方法在代码中,我最近遇到了一段非常糟糕的代码,该代码基于对对象执行某些操作的类转换。 当然,代码需要重构,但是如果您首先没有对该功能进行单元测试,则有时您可能无法做到/或者不想这样做(这…

手机推送信息到本地服务器,服务器信息推送到手机

服务器信息推送到手机 内容精选换一换服务器的计费方式为“包年/包月”,如果在计费周期内不想再继续使用,请参考本节指导进行退订。执行退订操作前,请确保待退订的服务器数据已完成备份或者迁移,退订完成后资源将被完全删除&#…

怎么修改服务器上的cpt文件,DELL-服务器-RAID-配置详解(28页)-原创力文档

DELL 服务器 RAID 配置详解磁盘阵列可以在安装系统之前或之后产生,系统会视之为一个(大型)硬盘,而它具有容 错及冗余的功能。磁盘阵列不单只可以加入一个现成的系统,它更可以支持容量扩展,方 法也很简单,只需要加入一个…

Apache Camel 2.21发布–新增功能

我们刚刚发布了Apache Camel 2.21,我将在此博客中重点介绍值得注意的更改。 此版本不支持Spring Boot2。对Spring Boot 2的支持将在Camel 2.22中提供, 我们计划在2018年夏季之前发布。 1)处理大型JMS消息 我们在JMS组件中添加了更好的支持&…

linux下网站服务器,Linux下使用Apache搭建Web网站服务器(示例代码)

[[email protected] ~]# yum install elinks –y主配置文件[[email protected] ~]# ls/etc/httpd/conf/httpd.conf/etc/httpd/conf/httpd.conf#我们又是怎么知道httpd的注配置文件是在你那里的呢?查看httpd注配置文件位置[[email protected] ~]# rpm -pql/mnt/Packa…

程序内存泄露监视_监视和检测Java应用程序中的内存泄漏

程序内存泄露监视因此,您的应用程序内存不足,您日夜不停地分析应用程序,以期捕获对象中的内存漏洞。 后续步骤将说明如何监视和检测您的内存泄漏,以确保您的应用程序处于安全状态。 1.怀疑内存泄漏 如果您怀疑有内存泄漏&#xf…

服务器可以装两个系统吗,云服务器可以装多个系统吗

云服务器可以装多个系统吗 内容精选换一换示例:购买并登录Windows弹性云服务器示例:购买并登录Linux弹性云服务器云平台提供了多种实例类型供您选择,不同类型的实例可以提供不同的计算能力和存储能力。同一实例类型下可以根据CPU和内存的配置…

与Spring的计划任务一起按时运行

您是否需要每天像闹钟一样在同一时间运行某个流程? 然后,Spring的预定任务适合您。 允许您使用Scheduled注释方法,以使其在指定的时间或内部间隔运行。 在本文中,我们将研究如何设置一个可以使用计划任务的项目,以及如…

jboss url路径_在JBoss的服务器端正确解码URL参数

jboss url路径我今天花了很多时间来弄清楚如何在运行在JBoss上的JSF应用程序中(使用JBoss 7 Final)强制正确解码编码的字符。 当您有例如通过URL传递中文字符时,就会发生此问题。 假设您有指点事件,编码为%E6&#xff…

在JDK 10中不可变与不可修改

大约两个月前, 斯图尔特马克斯 ( Stuart Marks)写道:“ 不变性就像葡萄酒 。” 然后,他提醒读者注意叔本华的熵定律 :“如果将一勺酒倒入装满污水的桶中,就会产生污水。 如果将一勺污水倒入装满…

@async方法不调用了_在Spring中使用Future对象调用Async方法调用

async方法不调用了下一个示例将演示Spring容器内部的异步方法调用。 为什么我们需要异步方法调用? 在某些情况下,我们并不真正知道是否需要重播或何时应返回结果。 传统方式在Java EE世界中处理异步调用的方法是使用队列/主题。 我们可以在Spring中进行相…

不同的休眠命名策略

本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后,我们将研究一下在休眠和配置中实施自定义…

基于FPGA,如何用Verilog HDL实现64位宽的扰码器?附上仿真结果。

文章目录前言一、扰码器1、什么是扰码器2、扰码的原理3、产生扰码的多项式二、Scrambler的Verilog实现1、scrambler.v2、scrambler_tb.v三、仿真结果四、总结前言 在数字信号处理系统中,因为发送端的数字信号序列可能会出现很长一段都是“0”,或很长一段…

基于FPGA,解扰码器Verilog的实现,以及扰码器与解扰码器的联合仿真。附上仿真结果。

文章目录前言一、扰码器二、解扰码器三、Descrambler的Verilog实现1、descrambler.v2、descrambler_tb.v四、扰码器与解扰码器的联合仿真1、scrambler_test.v2、scrambler_test_tb.v3、联合仿真结果五、总结前言 在数字信号处理系统中,因为发送端的数字信号序列可能…

光纤通信系统简介

文章目录前言一、直接检测光通信系统二、相干光通信系统三、直接检测与相干检测1、直接检测2、相干检测3、相干检测的优缺点(1)相干检测的缺点(2)相干检测的优点总结参考文献前言 光通信系统的基本组成结构如下图所示。光通信系统…

epyc rome_使用Encog,ROME,JSoup和Google Guava进行博客分类

epyc rome继续进行编程收集情报 ( Programming Collection Intelligence ,PCI),下一个练习是使用距离得分根据相关博客中使用的单词来确定博客列表。 我已经找到Encog作为AI /机器学习算法的框架,为此,我需…

重构字符串型系统

去年,我加入了一个项目,该项目接管了另一个未能满足客户需求的软件公司。 如您所知,在“继承”的项目及其代码库中,有许多事情可以并且应该加以改进。 可悲的是(但并不奇怪)领域模型就是这样一个孤零零&…

OFDM仿真程序,可直接运行,注释详细(没人注释比我还详细了)

OFDM仿真程序 clc clear allIFFT_bin_length128; %IFFT点数128个 carrier_count50; %子信道(子载波)数目 bits_per_symbol2; %4进制符号 symbols_per_carrier200;%每个子信道或者说子载波有200个符号 SNR0:1:40; for num1:41baseband_out_lengthcarrie…