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