18.3.3 Java 8新增的方法参数反射
Java8
在java.lang.reflect
包下新增了一个Executable
抽象基类,Executable
类对象代表可执行的
类成员,该类派生了Constructor
、 Method
两个子类。
获取方法或构造器的形参个数 形参名
Executable
基类提供了大量方法来获取修饰该方法
或构造器的注解
信息;还提供了isVarArgs()
方法用于判断该方法或构造器是否包含数量可变的形参,以及通过getModifiers()
方法来获取该方法或构造器的修饰符。除此之外, Executable
提供了如下两个方法来获取该方法或构造器的形参个数
及形参名
。
方法 | 描述 |
---|---|
int getParameter() |
获取该构造器或方法的形参个数 |
Parameter[] getParameters() |
获取该构造器或方法的所有形参。 |
获取参数信息
上面第二个方法返回了一个Parameter
数组, Parameter
也是Java 8
新增的APl
,每个Parameter
对象代表方法或构造器的一个参数。 Parameter
也提供了大量方法来获取声明该参数的泛型信息,还提供了如下常用方法来获取参数信息。
方法 | 描述 |
---|---|
getModifiers() |
获取修饰该形参的修饰符。 |
String getName() |
获取形参名 |
Type getParameterizedType() |
获取带泛型的形参类型。 |
Cass<?> getType() |
获取形参类型 |
boolean isNamePresent() |
该方法返回该类的class 件中是否包含了方法的形参名信息。 |
boolean isVarArgs() |
该方法用于判断该参数是否为个数可变的形参。 |
需要指出的是,使用javac
命令编译Java
源文件时,默认生成的.class
文件并不包含方法的形参名信息,因此调用isNamePresent()
方法将会返回false
,调用getName()
方法也不能得到该参数的形参名。如果希望javac
命令编译Java
源文件时可以保留形参信息,则需要为该命令指定-parameters
选项。
程序示例
如下程序示范了Java 8的方法参数反射功能。
1 | import java.lang.reflect.*; |
上面程序先定义了一个包含简单的Test
类,该类中包含一个replace(String str,List<String> list)
方法,程序中先是获取了该方法,然后分别用于获取该方法的形参名,形参类型和泛型信息。
只有当该类的.class
文件中包含形参名信息时,程序才会执行条件体内的三行粗体字代码。因此需要使用如下命令来编译该程序:javac -parameters MethodParameterTest.java
上面命令中-parameters
选项用于控制javac
命令保留方法形参名信息。
运行该程序,即可看到如下输出:
1 | G:\Desktop\随书源码\疯狂Java讲义第三版光盘\codes\18\18.3>javac -parameters MethodParameterTest.java |
本文重点
Java 8
新增了方法参数反射功能,可以获取方法的参数的信息,如获取:
- 形参的修饰符
- 形参名
- 形参个数等信息
要想保留形参名信息到.class
文件中,则在编译时要在javac
命令后面加上-parameters
选项.
原文链接: 18.3.3 Java 8新增的方法参数反射