通过反射查看类信息

Java 程序中的许多对象在运行时都会出现两种类型:编译时类型和运行时类型在这里插入图片描述
为了解决这个问题,程序需要在运行时发现对象和类的真实信息。解决该问题有以下两种做法:

  • 假设在编译和运行时都完全指定类型的具体信息,在这种情况下,可以先使用 instanceof 运算符进行判断,再利用 强制类型转换将其转换成运行时类型的变量即可。
  • 第二种做法是编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,这就必须使用反射。

本文包含:

  1. 获得 Class 对象
  2. 从 Class 中获取信息
  3. Java 8 新增的方法参数反射

1. 获得 Class 对象

每个类被加载之后,系统就会为该类生成一个对应的 Class 对象,通过该 Class 对象就可以访问到 JVM 中的这个类。在 Java 程序中获得 Class 对象通常有如下三种方式。
在这里插入图片描述
对于第一种方式和第二种方式都是直接根据类来获得该类的 Class 对象,相比之下,第二种方式有如下两种优势。
在这里插入图片描述

2. 从 Class 中获取信息

Class 类提供了大量的实例方法来获取该 Class 对象所对应类的详细信息,Class 类大致包含如下方法,下面每个方法都可能包含多个重载的版本。
下面 4 个方法用于获取 Class 对应类所包含的构造器。
在这里插入图片描述
下面 4 个方法用于获取 Class 对应类所包含的方法。
在这里插入图片描述
下面 4 个方法用于访问 Class 对应类所包含的成员变量。
在这里插入图片描述
如下几个方法用于访问 Class 对应类上所包含的 Annotation。
在这里插入图片描述
如下方法用于访问该 Class 对象对应类包含的内部类。
在这里插入图片描述
如下方法用于访问 Class 对象对于类所在的外部类。
在这里插入图片描述
如下方法用于访问该 Class 对象对应类所实现的接口。
在这里插入图片描述
下面方法用于访问该 Class 对象对应类所继承的父类。
在这里插入图片描述
如下方法用于获取 Class 对象对应类的修饰符、所在包、类名等基本信息。
在这里插入图片描述
此外,Class 对象还调用了如下几个判断方法来判断该类是否为接口、枚举、注解类型等。
在这里插入图片描述
上面的多个 getMethod() 方法和 getConstructor() 方法中,都需要传入多个类型为 Class<?>的参数,用于获取指定的方法或指定的构造器。
关于这个参数的作用,假设某个类内包含如下三个 info 方法签名。
在这里插入图片描述
这三个同名方法属于重载,它们的方法名相同,但参数列表不同。
如果想指定第二个 info方法,则必须指定方法名为 info ,形参列表为 String.class,在程序中获取该方法使用如下代码:
在这里插入图片描述
如果需要获取第三个info 方法,则使用如下代码:
在这里插入图片描述
获取构造器时无须传入构造器名—同一个类的所有构造器的名字都是相同的,所以要确定一个构造器只要指定形参列表即可。

3. Java 8 新增的方法参数反射

Java 8 新增了一个 Executable 抽象基类,该对象代表可执行的类成员,该类派生了 Constructor、Method 两个子类。
Executable 基类提供了大量方法来获取修饰该方法或者构造器的注解信息在这里插入图片描述
下面程序示范 Java 8 的条件参数反射功能。
在这里插入图片描述
在这里插入图片描述
运行该程序,即可看到如下输出:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值