jdk1.8 ::构造函数_在JDK 8中可通过反射获得构造函数/方法参数元数据

jdk1.8 ::构造函数

JDK 8较不广为人知的新 功能之一是在已编译的Java类中包含参数元数据的可选功能[JDK增强建议( JEP ) 118 ]。 此功能允许Java应用程序在运行时通过反射访问此参数元数据信息。

Java教程的Reflection API路径包括一个名为“ 获取方法参数的名称”的课程,该课程讨论并演示了如何在Java 8中应用此新功能。该课程包括一个示例Java类MethodParameterSpy ,可以对提供的Java类运行该类以指示特征方法和构造函数参数。 本课还强调这是一项可选功能,因为在.class文件中存储其他参数元数据会增加这些文件的大小。 该课程还指出,在某些情况下,参数名称包含开发人员不希望在已编译的.class文件中使用的敏感信息。

通过将-parameters选项传递给javac编译器,可以将其他参数元数据包含在用Java 8编译的.class文件中。 当一个人键入javac -help时,也会显示此-parameters选项,如下一个屏幕快照所示。

jdk8JavacHelp-parameters突出显示

javac上的Oracle TechNotes页面指示如何在运行时访问此附加的方法/构造函数参数数据:“将构造函数和方法的形式参数名称存储在生成的类文件中,以便从中获取方法java.lang.reflect.Executable.getParameters Reflection API可以检索它们。” 以下代码片段(名为ParameterDisplayer类)对此进行了演示(重点在displayParametersMetadata(String[])方法上)。

ParameterDisplayer.java

package dustin.examples.jdk8;import static java.lang.System.out;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;/*** Uses JDK 8 Parameter class to demonstrate metadata related to the parameters* of the methods and constructors of the provided class (includes private,* protected, and public methods, but does not include methods inherited from* parent classes; those classes should be individually submitted).* * @author Dustin*/
public class ParameterDisplayer
{private static void displayParametersMetadata(final String[] classesNames){for (final String className : classesNames){try{final Class clazz = Class.forName(className);// Get all class's declared methods (does not get inherited methods)final Method[] declaredMethods = clazz.getDeclaredMethods();for (final Method method : declaredMethods){writeHeader("Method " + method.toGenericString()+ " has " + method.getParameterCount() + " Parameters:");int parameterCount = 0;final Parameter[] parameters = method.getParameters();for (final Parameter parameter : parameters){out.println("\targ" + parameterCount++ + ": "+ (parameter.isNamePresent() ? parameter.getName() : "Parameter Name not provided,")+ (isParameterFinal(parameter) ? " IS " : " is NOT ")+ "final, type " + parameter.getType().getCanonicalName()+ ", and parameterized type of " + parameter.getParameterizedType()+ " and " + (parameter.isVarArgs() ? "IS " : "is NOT ")+ "variable." );}}}catch (ClassNotFoundException cnfEx){out.println("Unable to find class " + className);}}}private static void writeHeader(final String headerText){out.println("\n==========================================================");out.println("= " + headerText);out.println("==========================================================");}/*** Indicate whether provided Parameter is final.* * @param parameter Parameter to be tested for 'final' modifier.* @return {@code true} if provided Parameter is 'final'.*/private static boolean isParameterFinal(final Parameter parameter){return Modifier.isFinal(parameter.getModifiers());}public static void main(final String[] arguments){if (arguments.length < 1){out.println("You must provide the fully qualified name of at least one class.");System.exit(-1);}displayParametersMetadata(arguments);}
}

我最初考虑过针对JDK的知名类运行此类,但意识到这并不太有用,因为这些类不太可能是使用-parameters选项构建的。 因此,我创建了一个简单的示例类来辅助演示。 它称为ManyMethods然后显示。

ManyMethods.java

package dustin.examples.jdk8;import java.util.List;/*** Class with numerous methods intended to be used in demonstrating JDK 8's new* Parameter class.* * @author Dustin*/
public class ManyMethods
{public ManyMethods() {}private void addArrayOfStrings(String[] strings) {}private void addManyStrings(final String ... strings) {}private void addListOfStrings(final List<String> strings) {}@Overridepublic String toString(){return "ManyMethods";}
}

接下来的两个屏幕快照演示了在不使用-parameters选项和使用-parameters选项编译的ManyMethods实例上运行ParameterDisplayerManyMethods 。 最显着的区别是,不使用-parameters选项进行编译时,不提供参数名称。 另外,如果没有-parameters选项,则在编译时参数是否为final时也没有可信信息。 在不使用-parameters进行编译的情况下,无论-parameters是否为final , Parameter.getModifiers()方法均不包含final

parameterDisplayerOnClassWithoutParametersCompilation

parameterDisplayerOnClassWITHParametersCompilation

ParameterDisplayer类使用Parameter.isNamePresent()以编程方式标识不存在参数名称(当未使用-parameters选项进行编译时)。 如果未进行检查,则Parameter.getName()返回的参数名称将为“ arg”加上参数编号(第一个参数为arg0,第二个参数为arg1,依此类推)。

ManyMethods类中的三个方法中有一个具有参数的方法中的ManyMethods具有该参数的final修饰符。 仅当使用-parameters选项编译类时,才可以通过使用Parameter.getModifiers()进行反射来正确识别这些情况。

略有相关的旁注:Sun / Oracle工具文档始终由“ Windows”页面和“ solaris”页面组成,后者通常用于描述特定工具如何在Linux和Unix上的所有版本上工作。 我注意到Java 8文档对此进行了更改。 该文档仍然具有“ windows”版本,但是Unix / Linux版本现在其URL中具有“ unix”。 为了说明这一点,这里是Java SE 7和Java SE 8 javac工具页面的URL:

  • http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html
  • http://docs.oracle.com/javase/8/docs/technotes/tools/unix/javac.html
  • http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html
  • http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html

回到新的(带有Java 8) 参数类,值得注意的是,存储此附加参数元数据的已编译.class文件有所增加。 对于上面显示的我的ManyMethods类, .class文件从909字节扩大到961字节。

像Method一样, 构造 方法扩展了Executable ,因此Constructor类享有与Method相同的getParameters方法。 当使用这些额外信息显式编译代码时,Java 8将提供有关方法和构造函数参数的更多详细信息。

翻译自: https://www.javacodegeeks.com/2014/04/constructormethod-parameters-metadata-available-via-reflection-in-jdk-8.html

jdk1.8 ::构造函数

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

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

相关文章

lora无线通信模块LoRa技术在智能家居灯控上的应用

一、概述 灯在生活中随处可见&#xff0c;传统的灯光一种是每个灯对应着不同的开关&#xff0c;比如&#xff1a;家里的吊灯、壁灯、落地灯、台灯等等&#xff0c;一种是一键式总开关&#xff0c;比如&#xff1a;马路上的路灯&#xff0c;演唱会上的舞台灯&#xff0c;酒店一体…

如何对工业交换机端口进行调试?

随着工业物联网通信时代的到来&#xff0c;工业交换机的应用方面越来越广泛。当工业交换机出现问题时&#xff0c;我们该如何通过工业交换机端口进行快速检测配置是否正确&#xff1f;下面飞畅科技就给大家介绍一种调试方法&#xff1a;交换机环回测试&#xff01; 工业交换机…

[渝粤教育] 中央财经大学 审计学 参考 资料

教育 -审计学-章节资料考试资料-中央财经大学【】 随堂测试题1.1 1、【单选题】注册会计师审计产生的直接原因是( )。 A、所有权和经营权的分离 B、合伙企业制度的产生 C、股份制企业制度的形成 D、资本市场的发展 参考资料【 】 随堂测试1.2 1、【多选题】甲、乙、丙三人成立一…

无线数传模块SI4463、SI4438、SI4432方案无线通信比对

1.基本参数对比 以上图片是成都亿佰特科技有限公司基于SI4463、SI4438和SI4432三款芯片设计的相关产品&#xff0c;上述列表是基于三款产品的测试据。 2.功能简述 SI4432&#xff1a; SI4432是一款高集成度的芯片&#xff0c;减少了外围器件的成本&#xff0c;同时简化了整个…

以太网交换机和普通交换机主要的8大区别介绍

工业以太网交换机和普通交换机都是电&#xff08;光&#xff09;信号转发的网络通信设备&#xff0c;但是它们也有区别&#xff0c;下面飞畅科技就来为大家详细介绍下以太网交换机和普通交换机主要的8大区别&#xff0c;一起来看看吧&#xff01; 太网交换机和普通交换机的区别…

WIFI无线传输模块使用 ESP8266芯片方案接入云平台的方法

1、产品简介 ESP8266 的模块芯片是基于无线通信协议的 UART-WiFi透传模块芯片&#xff0c;支持 802.11b/g/n 的无线标准&#xff0c;并带有三种可选择的工作模式。ESP8266 模块的控制是通过 AT 指令的形式控制&#xff0c;例如选择 WiFi 的应用模式&#xff0c;列出、加入、退出…

[渝粤教育] 保定学院 艺术教育 参考 资料

教育 -艺术教育-章节资料考试资料-保定学院【】 第一单元【单元作业】谈谈科幻艺术的精神家园意义 第一单元【单元测验】 1、【单选题】艺术活动系统由 构成。 A、生活、艺术家、艺术品和创作活动 B、生活、艺术品、欣赏者和欣赏活动 C、艺术家、艺术品、欣赏者和创作、欣赏活动…

LoRa技术实现水表抄表远距离无线传输方案的应用

LoRa是LPWAN通信技术中的一种&#xff0c;是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。这一方案改变了以往关于传输距离与功耗的折衷考虑方式&#xff0c;为用户提供一种简单的能实现远距离、长电池寿命、大容量的系统&#xff0c;进而扩展传感网络…

[渝粤教育] 北京交通大学 大学计算机硬件实验 参考 资料

教育 -大学计算机硬件实验-章节资料考试资料-北京交通大学【】 第一讲测验 1、【单选题】阿兰图灵的图灵机理论模型对后来的计算机产生巨大影响&#xff0c;这篇论文是&#xff1a; A、《论可计算数及其在判定问题中的应用》 B、《存储程序通用电子计算机方案》 C、《继电器和开…

安防工业交换机将成为安防监控系统主要的传输设备

工业交换机即工业以太网交换机&#xff0c;它作用是放到路由器后端&#xff0c;来扩展路由器接口&#xff0c;以解决接口不够用的问题。以太网在设计时&#xff0c;由于其采用载波侦听多路复用冲突检测(CSMA/CD机制)&#xff0c;在复杂的工业环境中应用&#xff0c;其可靠性大大…

[渝粤教育] 北京化工大学 自然辩证法概论 参考 资料

教育 -自然辩证法概论-章节资料考试资料-北京化工大学【】 单选题 1、【单选题】自然辩证法的创始人是谁&#xff1f; A、马克思 B、恩格斯 C、马克思和恩格斯 D、杜林 参考资料【 】 2、【单选题】亚里斯多德认为自然是什么&#xff1f; A、自然就是自然界 B、自然是生成着的事…

低功耗/远距离lora模块:物联网智能家居、抄表多领域应用SX1262芯片方案

1、产品简述 SX1262是Semtech公司最新推出的一款远距离、低功耗的sub-GHz无线收发器&#xff0c;支持的工作频段涵盖了150–960MHz。SX1262提供了两种调试方式&#xff0c; LoRa以及传统的(G)FSK&#xff0c;是一款高性能物联网无线收发器&#xff0c;其特殊的LoRa调制方式可在…

Spring Reactive已经过时了吗? 螺纹连接反转

除了Spring的依赖注入仅解决控制反转问题的1/5之外&#xff0c;Spring Reactive还基于事件循环。 尽管还有其他流行的事件循环驱动解决方案&#xff08;NodeJS&#xff0c;Nginx&#xff09;&#xff0c;但单线程事件循环是每个请求线程&#xff08;线程池&#xff09;朝另一个…

从交换机浅谈安防视频会卡顿现象

解决视频卡顿、重新定义适用于安防视频数据的交换机才是正途。超高性价比&#xff08;与企业级相当&#xff09;、宽温&#xff08;保证室外应用稳定&#xff09;、大缓存&#xff08;保证每一个端口大数据帧不卡顿&#xff09;、高防护&#xff08;IP30 40&#xff0c;保证适用…

低功耗远距离lora模块:SX1262与SX1278、SX1276射频无线收发器芯片对比分析以及选型指南

1、产品简述 SX1278/6是Semtech公司在2013年推出的一款远距离、低功耗的无线收发器&#xff0c;是一款性能高的物联网无线收发器&#xff0c;具备特殊的LoRa调制方式&#xff0c;在一定程度上增加了通信距离&#xff1b;而SX1262是一款新产品&#xff0c;同样由Semtech公司在2…

[渝粤教育] 北京师范大学 中国哲学 参考 资料

教育 -中国哲学-章节资料考试资料-北京师范大学【】 第一周 《中国哲学》课程绪论&#xff1b; “先秦诸子”之先秦儒家&#xff08;单元测验&#xff09; 1、【单选题】荀子所指的“心”是&#xff08; &#xff09; A、形上之心 B、逻辑之心 C、天心 D、道德之心 参考资料【 …

[渝粤教育] 北京理工大学 工程热力学 参考 资料

教育 -工程热力学-章节资料考试资料-北京理工大学【】 第一章单元作业 第一章单元测验 1、【单选题】单元系统平衡态时各点的状态参数&#xff08; &#xff09;。 A、必定是均匀一致的 B、必定是接近相等的 C、是在不断变化的 D、不一定是均匀一致的 参考资料【 】 2、【单选题…

CC1101超低功耗无线模块在物联网能门锁中的应用

CC1101是TI的超低功耗无线收发芯片&#xff0c;支持sub-1 GHz频段&#xff0c;其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。CC1101可提供对数据包处理、数据缓冲、突发传输、接收信号强度指示(RSSI)、空闲信道评估(CCA)、链路质量指示&#xff08;LQI&#x…

交换机发生网络通信故障问题时该怎么办?

交换机故障一般可以分为硬件故障和软件故障两大类&#xff0c;交换机虽然不常发生故障&#xff0c;但是一旦发生故障后都不太好检测与排除。那么&#xff0c;当交换机发生网络通信故障了该怎么办呢&#xff1f;今天就由飞畅科技的小编来给大家说说交换机网络通信故障怎么办&…

[渝粤教育] 北京科技大学 离散数学 参考 资料

教育 -离散数学-章节资料考试资料-北京科技大学【】 命题逻辑单元测验 1、【单选题】以下哪个语句是命题&#xff1f; A、请不要抄袭&#xff01; B、太阳是行星。 C、这里能抽烟吗&#xff1f; D、x – y 3 参考资料【 】 2、【单选题】以下哪个命题是原子命题&#xff1f; A…