java 编程基础 Class对象 反射 :参数反射
方法参数反射
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
posted on 2021-05-16 16:55 zhangmingda 阅读(603) 评论(0) 编辑 收藏 举报