Java的反射机制及使用笔记
反射是指java在运行过程中,能够获取并调用任意类的所有属性和方法;
如同是类加载的过程,将类的各个组成部分封装成其他对象(Field,Method,Constructor),这便完成了一次反射
(系统自带的画图做这种图挺顺手的
为什么使用反射?
在反射面前,没有任何权限修饰的概念,运用反射可以在程序运行过程中操作任意对象;同时可以解耦,提高程序的可扩展性,代码的灵活性。
使用反射
获取Class对象
在进行操作之前,我们需要获取Class对象
- 获取Class对象的方式
1
2
31.Class.forName("类名"); 将字节码文件加载进内存,并返回Class对象(详细包路径)
2.类名.class; 通过类名的class属性来获取Class对象
3.Object.getClass(); 通过继承Object类下的getClass()来获取Class对象
抽象了一个测试用的Book类
1 | public class Book { |
使用如下代码来获取Class对象
1 | Class bookClass = Book.class; |
此时控制台打印
class reflect.Book
不同的获取Class方法适用于不同的使用场景,但需知一个类只会产生一个class对象.
获取Field
在获取Class对象后,便可以调用其中的成员变量了
Class使用Field描述成员变量,以下是获取方法
1 | 1.Field[] getFields(); 获取所有public修饰的成员变量 |
- 在获取成员变量Field后,我们可以进行获取与设置值操作
1
2set(Object obj,Object value); 设置值
get(Object obj); 获取值
测试代码
1 | public static void main(String[] args) throws Exception { |
控制台输出
class reflect.Book
public java.lang.String reflect.Book.author
/———
托尔金
/———
约翰·罗纳德·瑞尔·托尔金
80
需要注意的是,在访问私有成员变量(暴力反射)的时候,需要先使用setAccessible(boolean bool)来忽略权限修饰符
获取Constructor
Constructor用以描述类构造器,使用以下几种方式来获取Constructor对象
1 | 1.Constructor<?>[] getConstructors() |
- Constructor下有几种方法用以创建新的类对象
1
2T newInstance(Object... initargs);
值的留意的是,当使用空参构造方法创建对象时,直接使用Class下的newInstace()即可
测试代码
1 | public static void main(String[] args) throws Exception { |
控制台输出
魔戒
获取Method
Method代表成员方法,使用以下几种方式获取
1 | 1.Method[] getMethods() |
- Method下的方法
1
Object invoke(Object obj, Object... args); 执行方法
测试代码
1 | public static void main(String[] args) throws Exception { |
控制台输出
贝伦与露西恩
本文标题:Java的反射机制及使用笔记
文章作者:meteor
发布时间:2022-01-18
最后更新:2022-01-18
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!
分享