方法参数反射

Java8在java.lang.reflect包下新增了Executable抽象基类,该对象代表可执行的类成员,该类派生了Constructor和Method两个子类。Executable基类提供了大量方法来获取修饰该方法或构造器的注解信息:还提供了isVarArgs()用于判断该方法或构造器是否包含数量可变的形参,以及通过getModifiers()方法来获取该方法或构造器的修饰符。除此之外,Executable提供了如下两个方法来获取该方法或参数的形参个数及形参:
  • int getParameterCount(): 获取该构造器或方法的形参个数
  • Parameter[] getParameters(): 获取该构造器或方法的所有形参。
上面第二个方法返回了一个Parameter[]数组,Parameter也是Java8新增的API,每个Parameter象代表方法或构造器的一个参数。
Parameter提供了大量方法来获取声明该参数的泛型信息,还提供了如下常用方法来获取参数信息。
  • getModifiers(): 获取修饰该形参的修饰符。
  • String getName(): 获取形参名
  • Type getParameterizedType(): 获取带泛型形参类型。
  • Class<?> getType(): 获取形参类型
  • boolean isNamePresent(): 该方法返回该类的 class 文件中是否包含了方法的形参名信息。使用 Javac 命令编译Java源文件时,默认生成的class文件并不包含方法的形参名信息,因此调用 isNamePresent() 方法将会返回 false 调用 getName() 方法也不能得到该参数的形参名。如果希望 javac 命令编译Java源文件时可以保留形参信息,则需要为该命令指定-parameters选项。
  • boolean isVarArgs(): 方法用于判断该参数是否为个数可变的形参。
package com.zmd.parameter;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.List; /**
* @ClassName GetParameter
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/16.
*/
public class GetParameter {
public static void main(String[] args) throws NoSuchMethodException {
Class<Test> testClass = Test.class;
Method sayMethod = testClass.getDeclaredMethod("say", String.class, Integer.class, List.class);
//获取方法参数个数
System.out.println(sayMethod.getParameterCount());
//获取所有参数信息
Parameter[] parameters = sayMethod.getParameters();
int index =1;
for (Parameter parameter : parameters) {
System.out.println("第" + index + "个参数:");
System.out.println("参数名:"+parameter.getName());
System.out.println("参数类型:" + parameter.getType());
System.out.println("参数类型:" + parameter.getParameterizedType());
System.out.println("是否包含形参名信息:"+ parameter.isNamePresent());
System.out.println("是否是个数可变的形参:"+ parameter.isVarArgs());
}
}
}
3
第1个参数:
参数名:arg0
参数类型:class java.lang.String
参数类型:class java.lang.String
第1个参数:
参数名:arg1
参数类型:class java.lang.Integer
参数类型:class java.lang.Integer
第1个参数:
参数名:arg2
参数类型:interface java.util.List
参数类型:java.util.List<java.lang.Double>

如上是IDEA运行结果。参数名没有获取到

 javac 命令编译Java源文件时可以保留形参信息

编译javac -encoding "utf-8" -parameters com/zmd/parameter/GetParameter.java

在CMD 命令行运行java com/zmd/parameter/GetParameter

结果:

3
第1个参数:
参数名:name
参数类型:class java.lang.String
参数类型:class java.lang.String
是否包含形参名信息:true
是否是个数可变的形参:false
第1个参数:
参数名:age
参数类型:class java.lang.Integer
参数类型:class java.lang.Integer
是否包含形参名信息:true
是否是个数可变的形参:false
第1个参数:
参数名:list
参数类型:interface java.util.List
参数类型:java.util.List<java.lang.Double>
是否包含形参名信息:true
是否是个数可变的形参:false

最新文章

  1. python安装库
  2. iOS开发时,在Xcode中添加多个Targets进行版本控制
  3. Android 6.0 运行时权限处理
  4. 华为 MATE7 调试 LOCAT 日志不输出问题
  5. CART:分类与回归树
  6. [转]ACM进阶计划
  7. Nginx启动SSL功能,并进行功能优化,你看这个就足够了
  8. Sql Server 事物
  9. MySQL数据库web维护客户端管理工具
  10. POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配)
  11. Redis主从集群的Sentinel配置
  12. 网络基础之HTTP、TCP/IP、Socket
  13. Spring 自动定时任务配置
  14. nodejs即时通讯模块+SocketIO4Net的使用小结
  15. 分组背包模板题 hdu1712
  16. React之设置元素的滚动条
  17. hibernate的多对多关联映射
  18. 几个经典的css技巧
  19. I2C总线信号时序总结【转】
  20. python webdriver grid多节点运行webdriver程序

热门文章

  1. 对象池模式(Object Pool Pattern)
  2. Linux下Zabbix5.0 LTS + Grafana8.2.2图形可视化
  3. python之元编程
  4. 第42篇-JNI引用的管理(1)
  5. 【讲座】朱正江——基于LC-MS的非靶向代谢组学
  6. No.2 R语言在生物信息中的应用—模式匹配
  7. Excel-在整个工作簿中查找/替换
  8. 52-Linked List Cycle
  9. LeetCode两数之和
  10. A Child&#39;s History of England.39