HIT-软件构造 | Java 反射
在 Java 运行时,如果我们拿到一个 Object
,它可能是某个类的实例。如果我们想使用这个类的某个方法,却不知道这个类的名字,即连强制类型转换也做不了,那如何调用我们想要执行的方法呢。解决方案是使用 Java 反射。
Class
类与实例
如果我们有两个类 Type1
和 Type2
的实例,然后将其转换成 Object
实例。表面上我们看不出这两个 Object
实例的区别,因为我们对他们的信息一无所知,但是这只是因为他们的引用是 Object
类型的而已。
Java runtime 提供了一种数据类型,称为 Class
,Java 程序开始运行后,每次首次加载一个 class
,都会用这个 class
的信息创建一个 Class
实例,即这个 Class
实例将会包含这个类的所有信息。Object
类提供了一个接口能让我们拿到任何一个对象的 Class
实例。也就是说,对于上述的 Type1
和 Type2
转换成 Object
后的实例,我们可以拿到它们的 Class
实例,来区分这两个实例哪一个是 Type1
的实例、哪一个是 Type2
。
1 | class Type1 { ... } |
除此之外,还可以已知类的名字,然后直接获得其 Class
实例:
1 | Class cls = Type1.class; |
或使用包路径格式的完整类名:
1 | Class cls = Class.forName("com.vonbrank.Type1"); |
用 Class
实例访问字段
假设有一个类 Person
,定义如下:
1 | class Person { |
在下面的 test
方法中,我们只能拿到它实例的 Object
引用,如果想访问 name
可以这样写:
1 | public class Main { |
调用方法
此处我们以 String
为例展示通过反射调用对象实例的方法:
1 | public class Main { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Von Brank!