# 通俗大白话让你掌握Java反射机制
前言
框架很多内容都是基于java基础里面的反射机制而来的,很多时候就搞不明白怎么就可以这样子,今天我们就来写一篇关于java反射机制的文章记录一下,到底什么是反射,以及怎么用的,什么时候用哪种方式,作用是什么,在这里今天都能看到。
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是反射机制?
官方是这么定义反射机制的:反射是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。啥玩意,这也太官方了,一听这解释人都有点懵了。
不怕,我们直接上图:
所谓的反射小编认为就是字节码文件加载到内存中去时的这个过程,在这个过程中我们可以通过一些相关操作去调用到原java类里面的属性和方法,这就叫反射。
二、如何使用反射
1.创建字节码对象
代码如下(以上图示例):
创建字节码对象有三种方式:
第一种:Class.forName("该类的全限定名");
比如:
Class.forName("com.zhiyuan.frank.Person");
第二种:类名.class;
比如:
Person.class
第三种:对象名.getClass();
比如:
Person p = new Person();
p.getClass();
2.使用字节码对象调用相应的方法
字节码文件加载到内存之后,源文件里面的成员变量和成员方法都被抽象成了内存空间中的一个对象,所以有了字节码对象之后,想要调用里面的成员方法就调用获取成员方法的方法,比如getMethod();想要获取成员属性就调用获取成员属性的方法,比如getFiled();
总结
总而言之首先就是要创建字节码对象,有了字节码对象就能拿到加载到内存里面的方法信息,拿到了方法对象就可以调用invoke去执行原文件的方法了。这个过程就是反射。
Class.forName()这种情况下多用于加载配置时或者使用jar包里面的类时。比如jdbc连接数据库就是用这种方式加载的驱动.
类名.class这种情况多用于传递实际参数的时候
对象名.getClass()这种情况多用于原文件的对象类已经具备的时候