方法参数反射

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

java 编程基础 Class对象 反射 :参数反射的更多相关文章

  1. java 编程基础 Class对象 反射 :获取类的构造方法,方法,成员变量,内部类,外部类,父类,实现的接口,修饰符等...

    类 Class  每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类. 我们在Java中获取Class对象一般有三种方式: (1), 使用C ...

  2. java 编程基础 Class对象 反射:动态代理 和AOP:java.lang.reflect.Proxy:(Proxy.newProxyInstance(newProxyInstance​(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h))

    为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦.   Proxy类的使用规则 Proxy提 ...

  3. java 编程基础 Class对象 反射:代理模式和静态代理

    生活中的代理 类(对象)代理模式 代理模式是面向对象编程中比较常见的设计模式. 1. 用户只关心接口功能,而不在乎谁提供了功能.上图中接口是 Subject 2. 接口真正实现者是上图的 RealSu ...

  4. java 编程基础 Class对象 反射 :数组操作java.lang.reflect.Array类

    java.lang.reflect包下还提供了Array类 java.lang.reflect包下还提供了Array类,Array对象可以代表所有的数组.程序可以通过使 Array 来动态地创建数组, ...

  5. Java编程基础-面向对象(中)

    本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一 ...

  6. Java编程基础——标识符和关键字

    Java编程基础——标识符和关键字 摘要:本文主要介绍标识符和关键字. 标识符 是什么 Java语言中,为各种变量.方法.类和包等起的名字,统统称之为Java标识符. 命名规则 ◆ 应以字母.下划线. ...

  7. Java入门——(1)Java编程基础

    Java入门--(1)Java编程基础 第二章 Java编程基础   JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 }   2.1关键字:赋予了特殊含义的单词.   2.2标识符: ...

  8. Java开发知识之Java编程基础

    Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...

  9. Java编程基础——常量变量和数据类型

    Java编程基础——常量变量和数据类型 摘要:本文介绍了Java编程语言的常量变量和数据类型. 常量变量 常量的定义 一块内存中的数据存储空间,里面的数据不可以更改. 变量的定义 一块内存中的数据存储 ...

随机推荐

  1. python网络自动化运维之环境搭建(EVE-NG+pycharm)

    参考了很多资料,发现现在很多环境用的都是GNS3加linux下的python,几乎没有是用EVE-NG加上pycharm的教程,EVE的功能如此强大,存在的教程却较少,这里我出一篇教程供使用EVE作为 ...

  2. sprint-boot 日志

    市面上的日志框架: JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.... SpringBoot:底层是Spring框架,Spring框架默认是用JC ...

  3. rabbit mq的php使用 php-amqplib操作消息队列

    rabbit mq的php使用 php-amqplib操作消息队列 有大神翻译的教程,非常清楚可以参考: https://xiaoxiami.gitbook.io/rabbitmq_into_chin ...

  4. 微信第三方平台获取component_verify_ticket

    官方文档说明: 在公众号第三方平台创建审核通过后,微信服务器会向其"授权事件接收URL"每隔10分钟定时推送component_verify_ticket.第三方平台方在收到tic ...

  5. java中接口可以继承接口

    今天阅读别人的代码才发现,接口是可以继承接口的 一个类只能extends一个父类,但可以implements多个接口. 一个接口则可以同时extends多个接口,却不能implements任何接口. ...

  6. [源码解析] PyTorch 分布式 Autograd (5) ---- 引擎(上)

    [源码解析] PyTorch 分布式 Autograd (5) ---- 引擎(上) 目录 [源码解析] PyTorch 分布式 Autograd (5) ---- 引擎(上) 0x00 摘要 0x0 ...

  7. 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket

    进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...

  8. Docker镜像相关操作

    批量导入镜像 ll *.tgz|awk '{print $NF}'|sed -r 's#(.*)#docker load -i \1#' |bash 批量打tag docker images | se ...

  9. 19. 删除链表的倒数第 N 个结点

    目录 19.删除链表的倒数第N个节点 题目 题解-暴力 题解-哈希表 题解-双指针 19.删除链表的倒数第N个节点 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 输入:he ...

  10. mysql-centos8下安装

    参考文章 1.下载安装包 客服端与服务端 依赖包 2.linux下检查是否安装 rpm -qa | grep -i mysql 安装过会显示软件名称,没安装过就是空的 3.安装包传到虚拟机 先需要把安 ...