一、类的加载概述和加载时机
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方法
十一、动态代理
觉得有用的小伙伴请点赞、评论或收藏一下多支持支持博主小弟,跪安~~