java 编程基础 Class对象 反射 :参数反射
方法参数反射
- int getParameterCount(): 获取该构造器或方法的形参个数
- Parameter[] getParameters(): 获取该构造器或方法的所有形参。
- 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对象 反射 :参数反射的更多相关文章
- java 编程基础 Class对象 反射 :获取类的构造方法,方法,成员变量,内部类,外部类,父类,实现的接口,修饰符等...
类 Class 每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类. 我们在Java中获取Class对象一般有三种方式: (1), 使用C ...
- java 编程基础 Class对象 反射:动态代理 和AOP:java.lang.reflect.Proxy:(Proxy.newProxyInstance(newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h))
为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦. Proxy类的使用规则 Proxy提 ...
- java 编程基础 Class对象 反射:代理模式和静态代理
生活中的代理 类(对象)代理模式 代理模式是面向对象编程中比较常见的设计模式. 1. 用户只关心接口功能,而不在乎谁提供了功能.上图中接口是 Subject 2. 接口真正实现者是上图的 RealSu ...
- java 编程基础 Class对象 反射 :数组操作java.lang.reflect.Array类
java.lang.reflect包下还提供了Array类 java.lang.reflect包下还提供了Array类,Array对象可以代表所有的数组.程序可以通过使 Array 来动态地创建数组, ...
- Java编程基础-面向对象(中)
本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一 ...
- Java编程基础——标识符和关键字
Java编程基础——标识符和关键字 摘要:本文主要介绍标识符和关键字. 标识符 是什么 Java语言中,为各种变量.方法.类和包等起的名字,统统称之为Java标识符. 命名规则 ◆ 应以字母.下划线. ...
- Java入门——(1)Java编程基础
Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符: ...
- Java开发知识之Java编程基础
Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...
- Java编程基础——常量变量和数据类型
Java编程基础——常量变量和数据类型 摘要:本文介绍了Java编程语言的常量变量和数据类型. 常量变量 常量的定义 一块内存中的数据存储空间,里面的数据不可以更改. 变量的定义 一块内存中的数据存储 ...
随机推荐
- shell常用集锦
该文整理一些常用的shell用法,及语法,并非介绍如何使用 变量 变量可分为两类:环境变量ENV(全局)和局部变量. bash环境变量 变量名 含义 _= 上一条命令的最后一个参数 BASH_VERS ...
- Python之阶乘代码
#coding=utf-8 while True: num = int(input("请输入要阶乘的正整数数字,按负数退出:")) jiec=1 if nu ...
- AC 自动机学习笔记
虽然 NOIp 原地爆炸了,目前进入 AFO 状态,但感觉省选还是要冲一把,所以现在又来开始颓字符串辣 首先先复习一个很早很早就学过但忘记的算法--自动 AC AC自动机. AC 自动机能够在 \(\ ...
- 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)
洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...
- Demo03找素数
package Deom1;import java.awt.*;import java.util.Scanner;public class lx {//输入任意两个正整数,求出这两个正整数之间素数的个 ...
- 【Redis】Sentinel 哨兵模式
Sentinel(哨兵模式) 目录 Sentinel(哨兵模式) 哨兵模式的三个定时任务 Sentinel(哨兵)与Sentinel .主服务器.从服务器之间的连接 检测下线状态 选择领头 Senti ...
- Learning Spark中文版--第六章--Spark高级编程(2)
Working on a Per-Partition Basis(基于分区的操作) 以每个分区为基础处理数据使我们可以避免为每个数据项重做配置工作.如打开数据库连接或者创建随机数生成器这样的操作,我们 ...
- 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),
1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...
- 利用python爬取城市公交站点
利用python爬取城市公交站点 页面分析 https://guiyang.8684.cn/line1 爬虫 我们利用requests请求,利用BeautifulSoup来解析,获取我们的站点数据.得 ...
- 【Penetration】红日靶场(一)
nmap探查存活主机 nmap -sP 10.10.2.0/24 图片: https://uploader.shimo.im/f/cfuQ653BEvyA42FR.png!thumbnail?acce ...