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; 工业交换机…

无线数传模块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;列出、加入、退出…

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

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

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

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

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

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

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

解决视频卡顿、重新定义适用于安防视频数据的交换机才是正途。超高性价比&#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…

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

教育 -工程热力学-章节资料考试资料-北京理工大学【】 第一章单元作业 第一章单元测验 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…

E103-W01产品WiFi无线模块快连技术在智能家居中的应用

WiFi是一种允许电子设备连接到一个无线局域网&#xff08;WLAN&#xff09;的技术&#xff0c;通常使用2.4G UHF或5G SHF ISM 射频频段。连接到无线局域网通常是有密码保护的&#xff1b;但也可是开放的&#xff0c;这样就允许任何在WLAN范围内的设备可以连接上。Wi-Fi是一个无…

亿佰特Wifi模块、蓝牙模块和Zigbee模块协议在物联网智能家居上的应用指南

物联网是新一代信息技术的重要组成部分&#xff0c;也是“信息化”时代的重要发展阶段。其英文名称是&#xff1a;“Internet of things&#xff08;IoT&#xff09;”。顾名思义&#xff0c;物联网就是物物相连的互联网。这有两层意思&#xff1a;其一&#xff0c;物联网的核心…

交换机选用要点及订货主要技术条件

现如今&#xff0c;随着通信业的发展以及国民经济信息化的推进&#xff0c;以太网技术已成为当今最重要的一种局域网组网技术&#xff0c;网络交换机也就成为了最普及的交换机&#xff0c;网络交换机市场呈稳步上升态势。那么&#xff0c;我们在选购网络交换机的时候该注意哪些…

亿佰特电源模块:无线通信模块电平转换指南

在我们电路设计中&#xff0c;常常会遇到无线通信电平转换的问题&#xff0c;在应用电平转换的措施之前还需要判断进行电平转换的必要性。 如果你是用的是3.3V器件作为输出&#xff0c;而5V器件作为接收&#xff0c;那么这种低电平输出不会损坏器件&#xff0c;而且大部分3.3V…

路由器和交换机哪个更好?路由器交换机怎么连接?

路由器与交换机是我们常见的两种设备&#xff0c;它们的功能非常相似&#xff0c;当我们需要连接网络的设备比较多的时候&#xff0c;路由器往往就显得有点“力不从心”了&#xff0c;此时就需要用到交换机&#xff0c;它可以让更多的设备连接上网络&#xff0c;在作用上似乎与…

当HTTP状态代码不足时:处理Web API错误报告

RESTful Web API设计的一个领域&#xff08;经常被忽视&#xff09;是如何报告与业务或应用程序有关的错误和问题。 首先要想到HTTP状态代码的正确用法&#xff0c;尽管它非常方便&#xff0c;但通常它的信息量还不够。 让我们以400错误请求为例。 是的&#xff0c;它清楚地表明…