Java高级特性--反射

一、什么是反射?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

简单的来说:

1.通过new关键字创建对象操作对象,在编译时就已经确定。

2.通过反射可以在程序运行过程中动态的操作对象,可以获得编译期无法获得的信息,动态操作最大限度发挥了java扩展性。

二、反射原理

Java反射的原理:java类的执行需要经历以下过程:

1、编译:.java文件编译后生成.class字节码文件

2、加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例

3、链接

验证:格式(class文件规范) 语义(final类是否有子类) 操作

准备:静态变量赋初值和内存空间,final修饰的内存空间直接赋原值,此处不是用户指定的初值。

解析:符号引用转化为直接引用,分配地址

4、初始化:有父类先初始化父类,然后初始化自己;将static修饰代码执行一遍,如果是静态变量,则用用户指定值覆盖原有初值;如果是代码块,则执行一遍操作。

        Java的反射就是利用上面第二步加载到jvm中的.class文件来进行操作的。.class文件中包含java类的所有信息,当你不知道某个类具体信息时,可以使用反射获取class,然后进行各种操作。

       Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。总结说:反射就是把java类中的各种成分映射成一个个的Java对象,并且可以进行操作。

三、反射机制相关

与Java反射相关的类如下:

反射可访问的常用信息

Java 反射机制主要提供了以下功能,这些功能都位于java.lang.reflect包。

1、在运行时判断任意一个对象所属的类。

2、在运行时构造任意一个类的对象。

3、在运行时判断任意一个类所具有的成员变量和方法。

4、在运行时调用任意一个对象的方法。

5、生成动态代理。

四、反射的使用

1、java中的Class三种获取方式

jdk提供了三种方式获取一个对象的Class,就Person person 来说

1.person .getClass(),这个是Object类里面的方法

2.Person .Class属性,任何的数据类型,基本数据类型或者抽象数据类型,都可以通过这种方式获取类

3.Class.forName(""),Class类提供了这样一个方法,让我们通过类名来获取到对象类

说明:在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。

2、如何通过反射获取私有成员变量和私有方法

运行结果


五、java反射调用service或mapper中的接口

        java反射调用service或mapper中的接口需要一个实例,但是接口无法提供这样的实例,但是JDK提供了一个叫做动态代理的东西,这个代理恰恰只能代理接口。所以我们想要反射接口需要使用这个动态代理来做。在java的动态代理机制中,有两个重要的东西,一个是 InvocationHandler(接口)、另一个则是 Proxy(类),这是我们动态代理必须用到的两个东西。

应用场景

       假如现在我们需要通过反射得到TestMapper接口,然后调用其中的一个selectById方法。现在如果我们需要反射使用该接口根据用户ID获取用户对象是无法直接反射调取的,所以我们需要一个动态代理类。创建一个MyInvocationHandler实现InvocationHandler接口,去生成代理对象并调用方法。

出自 :作者:一觉睡到丶小时候 链接:https://www.jianshu.com/p/86e759eff7c6

你可能感兴趣的:(Java高级特性--反射)