
获取运行时类的完整结构
获取类信息:使用 获取字段:通过 获取方法:使用 获取构造器:使用 获取注解:通过 获取父类和接口:使用
发布日期:2021-05-14 16:20:26
浏览次数:18
分类:精选文章
本文共 3457 字,大约阅读时间需要 11 分钟。
通过反射机制,我们可以动态地获取运行时类的完整结构,包括字段、方法、构造器、父类、接口以及注解等信息。以下是使用Java反射API获取这些信息的详细步骤和案例。
获取运行时类的完整结构
1. 获取所有字段
- 公共字段:使用
Class.getFields()
方法,可以获取当前类及其所有父类的所有公共字段。如果只需要当前类的所有字段,不论其访问权限,使用Class.getDeclaredFields()
。
2. 获取所有方法
- 公共方法:
Class.getMethods()
方法返回当前类及其所有父类的所有公共方法。 - 所有方法:
Class.getDeclaredMethods()
方法返回当前类的所有方法,包括私有方法。
3. 获取所有构造器
- 公共构造器:
Class.getConstructors()
获取当前类的所有公共构造器。 - 所有构造器:
Class.getDeclaredConstructors()
获取当前类的所有构造器,包括私有构造器。
4. 获取注解
- 通过
Class.getAnnotation()
方法可以获取类级注解。 - 对于方法或字段的注解,使用相应的
Method.getAnnotation()
或Field.getAnnotation()
方法。
5. 获取父类和接口
- 父类:
Class.getSuperclass()
返回当前类的父类。 - 实现的接口:
Class.getInterfaces()
返回当前类实现的所有接口。
案例说明
package Reflection;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class Test07 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException { // 获取类的信息 Class c1 = Class.forName("Reflection.User"); System.out.println("类的全名:" + c1.getName()); System.out.println("类的简名:" + c1.getSimpleName()); System.out.println("\n获取所有字段:"); Field[] fields = c1.getFields(); for (Field field : fields) { System.out.println(field.toString()); } System.out.println("\n获取所有字段(包括私有):"); Field[] declaredFields = c1.getDeclaredFields(); for (Field field : declaredFields) { System.out.println(field.toString()); } System.out.println("\n获取方法(包括继承类的):"); Method[] methods = c1.getMethods(); for (Method method : methods) { System.out.println(method.toString()); } System.out.println("\n获取当前类的所有方法(包括私有):"); Method[] declaredMethods = c1.getDeclaredMethods(); for (Method method : declaredMethods) { System.out.println(method.toString()); } // 获取指定方法 try { Method getName = c1.getMethod("getName"); System.out.println("方法:" + getName.getName()); Method setName = c1.getMethod("setName", String.class); System.out.println("方法:" + setName.getName()); } catch (NoSuchMethodException e) { System.out.println("方法不存在:" + e.getMessage()); } // 获取构造器 System.out.println("\n获取公共构造器:"); Constructor[] publicConstructors = c1.getConstructors(); for (Constructor constructor : publicConstructors) { System.out.println(constructor.toString()); } System.out.println("\n获取所有构造器(包括私有):"); Constructor[] allConstructors = c1.getDeclaredConstructors(); for (Constructor constructor : allConstructors) { System.out.println(constructor.toString()); } // 获取指定构造器 Constructor userConstructor; try { userConstructor = c1.getDeclaredConstructor(int.class, String.class, int.class); System.out.println("特定构造器:" + userConstructor); } catch (NoSuchConstructorException e) { System.out.println("构造器不存在:" + e.getMessage()); } }}
代码解释
Class.forName("Reflection.User")
获取指定类的类对象。getFields()
和getDeclaredFields()
获取字段信息。getMethods()
和getDeclaredMethods()
获取方法信息。getConstructors()
和getDeclaredConstructors()
获取构造器。getAnnotation()
方法获取注解信息。getSuperclass()
获取父类,getInterfaces()
获取接口信息。通过这些方法,可以全面了解运行时类的结构和内部信息,方便进行代码分析、调试和动态加载等任务。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月23日 18时52分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【SQLI-Lab】靶场搭建
2019-03-08
Xception 设计进化
2019-03-08
【Bootstrap5】精细学习记录
2019-03-08
LeetCode197.打家劫舍
2019-03-08
A simple problem HDU-2522 【数学技巧】
2019-03-08
Struts2-从值栈获取list集合数据(三种方式)
2019-03-08
vscode中快速生成vue模板
2019-03-08
参考图像
2019-03-09
设计模式(18)——中介者模式
2019-03-09
用JavaScript实现希尔排序
2019-03-09
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
BUU-MISC-认真你就输了
2019-03-09
BUU-MISC-caesar
2019-03-09
【专题2:电子工程师 之 上位机】 之 【36.事件重载】
2019-03-09
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
2019-03-09
一文理解设计模式--命令模式(Command)
2019-03-09
VTK:可视化之RandomProbe
2019-03-09