Java之反射机制知识点

一、类的加载概述和加载时机

1.类的加载概述

   当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步来实现对这个类进行初始化。

   加载:指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象

   连接:验证   是否有正确的内部结构,并和其他类协调一致。

              准备   负责为类的静态成员分配内存,并设置默认初始化值

              解析   将类的二进制数据中的符号引用替换为直接引用

   初始化

2.加载时机

   创建类的实例

   访问类的静态变量,或者为静态变量赋值

   访问类的静态方法

   使用反射方式来强制创建某个类或接口对应的Java.lang.Class对象

   初始化某个类的子类

   直接使用java.exe命令来运行某个主类

二、类加载器的概述和分类

1.类加载器的概述

   负责将.class文件加载到内存中,并为之生成对应的class对象。虽然我们不需要关心类加载机制,但是了解这个机制我们就能     更好的了解程序的运行。

2.分加载器的分类

   Bootstrap ClassLoader  根类加载器

   Extension ClassLoader 扩展类加载器

   System ClassLoader  系统类加载器

3.类加载器的作用

   Bootstrap ClassLoader  根类加载器

      也被称为引导类加载器,负责Java核心类的加载,例如System,String等,在JDK的JRE的lib目录下rt.jar文件中。

   Extension ClassLoader 扩展类加载器

      负责JRE的扩展目录中jar包的加载。在JDK中JRE的lib目录下ext目录。

   System ClassLoader  系统类加载器

      负责在JVM启动时加载来自Java命令的class文件,以及classpath环境变量所指定的jar包和类路径。

三、反射概述

1.反射概述

   Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法

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

   这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射机制

   要想解剖一个类,必须先要获取到该类的字节码文件对象

   而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象

2.获取Class对象的三种方式

四、Class.forName()读取配置文件

1.创建一个配置文件config.properties,将类名写入,用程序读出。

2.代码(Class类的newInstance方法调用的是该类的无参的构造函数创建对象,如果一个类没有无参构造,此法不可用)

3.每次修改实例对象只需要修改配置文件的类即可,不需要修改代码。

五、通过反射获取带参构造方法并使用

六、通过反射获取成员变量并使用

1.Class.getField(String)方法可以获取类中的指定字段

2.如果是私有的可以用getDeclaedField("name")方法暴力获取,通过set(obj,"李四")方法可以设置指定对象上的该字段的值。

3.如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值。如果不设置权限直接操作私有字段会报错。

七、通过反射获取方法并使用

通过反射获取方法并使用
Class.getMethod(方法名,方法参数)和Class.getDeclareMethod,后者为有权限需要暴力获取的方法
获取后可以 方法名.invoke(对象) 调用。

八、通过反射越过泛型检查

ArrayList<Integer>是一个对象,在这个集合中添加一个字符串数组,如何实现呢?
泛型只有在编译期有效,在运行期会被抹除。
所以我们可以在运行的时候利用反射加入。

九、通过反射写一个通用的设置某个属性为指定值的方法

十、通过配置文件读取类名,然后获取相应字节码对象,并执行其中的run方法

十一、动态代理

觉得有用的小伙伴请点赞、评论或收藏一下多支持支持博主小弟,跪安~~

发布了55 篇原创文章 · 获赞 126 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40275740/article/details/104156137