方法参数反射

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. 流程图(flowchart)语法学习

    创建流程图需要选择语言: mermaid流程中的代码包裹graph 这里写顺序end流程图方向:从上到下(TB),从下到上(BT),从左到右(LR),从右到左(RL) TB - 从上到下TD - 自上 ...

  2. java番外茶余饭后闲聊

    java番外茶余饭后闲聊 **本人博客网站 **IT小神 www.itxiaoshen.com 今天聊点题外话没事时可以作为平时沟通交流的谈资,接下来一起简单了解下个人知晓对Java界开发产生深远影响 ...

  3. 如何在Docker容器中使用Arthas

    Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar ...

  4. Educational Codeforces Round 94 题解

    我竟然比到了全场的 rk 14,incredible! A 大水题,直接输出 \(n\) 遍 \(s_n\) 即可. B 分类讨论题,放在 B 题可能难度有点大了. 直接暴力枚举你拿了多少个宝剑,然后 ...

  5. DP 优化方法大杂烩 & 做题记录 I.

    标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...

  6. 自助分析工具Power BI的简介和应用

    作为一名资深的IT技术人,特别喜欢学习和尝试新技术,也勇于接受挑战,勇于创新,不仅能发现问题,更要解决实际的疑难杂症,闲暇时光也乐于分享一些技术干货.记得2017年的时候,华章出版社的编辑通过网上找到 ...

  7. 金蝶EAS——登录某个数据中心门户时报错“获取用户相关信息失败!请查看服务器日志,并确认是否数据库设置错误或者版本不匹配!”

    登录服务器后台,查看金蝶BOS控制台,选择数据中心中的目标数据中心,点击测试连接,提示报错如下: 说明是数据库问题,需要登录数据库服务器去检查数据库.详细操作见:

  8. Browse Code Answers

    一个记录各种语言可能遇到的问题的论坛 :https://www.codegrepper.com/code-examples/

  9. RabbitMQ消息中介之Python使用

    本文介绍RabbitMQ在python下的基本使用 1. RabbitMQ安装,安装RabbitMQ需要预安装erlang语言,Windows直接下载双击安装即可 RabbitMQ下载地址:http: ...

  10. 多人协作解决方案,git flow的使用

    简介 Gitflow工作流程围绕项目发布定义了严格的分支模型. 为不同的分支分配了非常明确的角色,并且定义了使用场景和用法.除了用于功能开发的分支,它还使用独立的分支进行发布前的准备.记录以及后期维护 ...