zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 2.安装配置OpenStack基础服务
    OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 1.操作系统环境配置
    ssh免密登录
    PHP实现识别带emoji表情的字符串
    算法-PHP实现八大算法
    项目总结-第一次外包项目2-项目相关
    PHP.52-TP框架商城应用实例-前台4-商品详情页-面包屑导航、AJAX浏览历史
    PHP.51-TP框架商城应用实例-前台3-楼层推荐、TP框架雪崩问题
    PHP.50-TP框架商城应用实例-前台2-商品推荐
    PHP.49-TP框架商城应用实例-前台1-公共布局、制作首页
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14774145.html
Copyright © 2011-2022 走看看