反射

一、Java反射描述(即它的作用)的是,在运行状态中:

1、对于任意一个类,都能够知道这个类的所有属性和方法

2、对于任意一个类,都能够调用它的任意一个属性和方法

        实际上通过反射,不仅仅可以获知类的属性、方法,还可以获知类的父类、接口、包等信息。

二、反射原理:我们知道,一个类在加载的时候,会在内存中生成一个代表这个.class文件的java.lang.Class对象,,.classs文件里面就包含了描述这个类的信息的一切内容。

       因此我们想要解剖该类,就首先要获取这类的对应的Class类型对象,使用该类的对应的Class类型对象的方法,就可以对该类进行解剖。说白了就是我们通过反射技术,将类的各种成分映射成一个个的java对象,通过这些对象来动态获取类信息。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

类加载示意如下:

     简单写一下反射技术流程:

1、获取Class类型对象,三种方法,视情况分别使用:

1、1  Object ——> getClass(); 

1、2  任何数据类型(包括基本数据类型)都有一个“静态”的class属性 ;

1、3   通过Class类的静态方法:forName(String  className)(常用)

2、通过class对象的方法获取类各种成分的java对象,比如Constrctor、Field对象以及Method对象等

3、再通过获取到各成分对象各自的方法,来进行动态获取类各组成成分信息。

三、反射的其他应用:

1、通过反射运行配置文件内容。需求:我们利用反射和配置文件,可以使:应用程序更新时,对源码无需进行任何修, 我们只需要将新类发送给客户,并修改配置文件即可

(1)定义一个Student类:

 

以及一个pro.txt文件,内容如下:

 (2)Demo:

当我们需求Student类发生改变时,只需要在配置文件pro.txt内修改内容,其他代码都不用动就可以重新适应新需求了

2、通过反射越过泛型检查:我们知道当定义一个集合时如果指定了集合存储的数据类型,则无法再存储其他数据类型的数据了,否则会报编译错误,如果我们硬要往指定数据类型的集合中添加数据,我们可以利用反射。泛型是用在编译期,编译过后泛型擦除(消失掉)。所以是可以通过反射越过泛型检查的。

 总结:反射很重要,有句话叫反射是框架的灵魂,意思是反射对框架而言的重要性是不言而喻的。使用反射的前提是获取Class类型对象,理解在于类的加载,即但我们创建一个类时,jvm会自动创建.class文件的Class对象(一个类只有这么一个对象,一一对应),通过这个对象来反向获取该类的所有信息。

 

原文地址:https://www.cnblogs.com/monkey-yty/p/13124997.html