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编辑  收藏  举报

导航