Java反射之Java获取方法信息实践
本文主要获取类的信息(包括类的成员函数、成员变量)
获取类的信息
前面文章已经说过了,有三种方式,本文就不在赘述,采用其中的一种,通过实例对象.getClass()获取类类型,从而获取类的名称
Class c = obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型 c.getName()
public static void main(String[] args) {
Class c1 = int.class;
Class c2 = String.class;
Class c3 = double.class;
Class c4 = Double.class;
//void关键字 存在类类型
Class c5 = void.class;
System.out.println(c1.getName());
System.out.println(c2.getName());
//不包含包名的类名称
System.out.println(c2.getSimpleName());
System.out.println(c3.getName());
System.out.println(c4.getName());
}
其中obj是Object obj实例后的对象
成员函数(获取类的方法对象)
Method类,方法对象,一个成员方法就是一个Method对象
- 获取的是所有public的函数,包括父类继承而来的
getMethods() 方法获取的是所有public的函数,包括父类继承而来的
- 获取的是所有该类自己什么的方法
getDeclaredMethods() 获取的是所有该类自己什么的方法,不论访问权限
- 方法的返回值类型的类类型
Class returnType = ms[i].getReturnType();
- 得到方法的返回值类型的名称
returnType.getName()
- 方法的名称
ms[i].getName()
- 获取参数类型
Class[] parameterTypes = ms[i].getParameterTypes();
成员变量
成员变量也是对象,java.lang.reflect.Field, Field类封装了关于成员变量的操作
getFields()方法获取的是所有public的成员变量的信息
getDeclaredFields()获取的是该类自己声明的成员变量的信息
- 获取成员变量数组
Field[] fs = c.getDeclaredFields();
- 获取成员变量的类型名称
Class fieldType = fd.getType(); String typeName = fieldType.getName();
- 获取成员变量的名称
String fieldName = fd.getName();
完整实例
ClassUtil
public class ClassUtil {
/**
* 打印类的信息,包括类的成员函数、成员变量
*/
public static void printClassMessage(Object obj){
//要获取类的信息 首先要获取类的类类型
Class c = obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型
//获取类的名称
System.out.println("获取类的名称:"+c.getName());
/**
* Method类,方法对象
* 一个成员方法就是一个Method对象
* getMethods() 方法获取的是所有public的函数,包括父类继承而来的
* getDeclaredMethods() 获取的是所有该类自己什么的方法,不论访问权限
*/
// Method[] ms = c.getMethods();
Method[] ms = c.getDeclaredMethods();
for (int i=0;i<ms.length;i++){
//得到方法的返回值类型的类类型
Class returnType = ms[i].getReturnType();
//得到方法的返回值类型的名称
System.out.println(returnType.getName());
//得到方法的名称
System.out.print(ms[i].getName()+"(");
//获取参数类型--->得到的是参数列表的类型的类类型
//eg: string ---> 得到String.class
Class[] parameterTypes = ms[i].getParameterTypes();
for(Class c1:parameterTypes){
System.out.print(c1.getName()+",");
}
System.out.print(")");
}
/**
* 获取成员变量
* @param obj
*/
public static void printFieldMessage(Object obj){
//要获取类的信息 首先要获取类的类类型
Class c = obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型
Field[] fs = c.getDeclaredFields();
for(Field fd:fs){
//得到成员变量的类型的类类型
Class fieldType = fd.getType();
String typeName = fieldType.getName();
//得到成员变量的名称
String fieldName = fd.getName();
System.out.println(typeName+" "+fieldName);
}
}
}
所有public的函数的方法信息
public static void main(String[] args) {
String s= "hello";
ClassUtil.printClassMessage(s);
ClassUtil.printFieldMessage(s);
Integer a = 1;
ClassUtil.printClassMessage(a);
ClassUtil.printFieldMessage(a);
}
- 运行结果展示:

获取自己写的类的方法信息
public class ClassUtil {
/**
* 打印类的信息,包括类的成员函数、成员变量
*/
public static void printClassMessage(Object obj){
//要获取类的信息 首先要获取类的类类型
Class c = obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型
//获取类的名称
System.out.println("获取类的名称:"+c.getName());
/**
* Method类,方法对象
* 一个成员方法就是一个Method对象
* getMethods() 方法获取的是所有public的函数,包括父类继承而来的
* getDeclaredMethods() 获取的是所有该类自己什么的方法,不论访问权限
*/
// Method[] ms = c.getMethods();
Method[] ms = c.getDeclaredMethods();
for (int i=0;i<ms.length;i++){
//得到方法的返回值类型的类类型
Class returnType = ms[i].getReturnType();
//得到方法的返回值类型的名称
System.out.println(returnType.getName());
//得到方法的名称
System.out.print(ms[i].getName()+"(");
//获取参数类型--->得到的是参数列表的类型的类类型
//eg: string ---> 得到String.class
Class[] parameterTypes = ms[i].getParameterTypes();
for(Class c1:parameterTypes){
System.out.print(c1.getName()+",");
}
System.out.print(")");
}
}
public static void main(String[] args) {
ThemeInfo themeInfo = new ThemeInfo();
themeInfo.setId("1");
ClassUtil.printClassMessage(themeInfo);
ClassUtil.printFieldMessage(themeInfo);
}
}
运行结果展示:
- 成员方法:

- 成员变量:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Spring Data JPA原理与实战 Repository接口的最佳实践
这篇文章深入解析了Spring Data JPA的实现原理,包括Repository接口的层次结构、方法名解析、查询生成策略、事务管理和性能优化,通过源码剖析和实战案例,感兴趣的朋友跟随小编一起看看吧2026-01-01
IntelliJ IDEA AI Assistant 携带OpenCode保姆级
本文介绍了JetBrains官方AI插件AIAssistant的安装、使用及接入本地客户端的过程,通过安装、测试、接入本地客户端等步骤,详细描述了使用过程中的注意事项和操作方法,感兴趣的朋友跟随小编一起看看吧2026-04-04
在SpringBoot项目中优雅的连接多台Redis的操作方法
本文将基于一个实际案例,详细介绍如何在Spring Boot中优雅地配置和使用多个Redis实例,解决常见的注入歧义问题,并提供一个通用的Redis工具类来简化操作,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧2025-09-09


最新评论