失效链接处理 |
Java反射、动态代理详解 PDF 下载
本站整理下载:
相关截图:
主要内容:
Java反射、动态代理详解,看这篇文章就够了
要了解Java反射机制,先来看看Java类的加载过程
一、类的加载
类的加载过程
1.加载
加载过程主要完成三件事情:
(1)通过类的全限定名来获取定义此类的二进制字节流
(2)将这个类字节流代表的静态存储结构转为方法区的运行时数据结构
(3)在堆中生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入
口。
2.连接
(1)校验:其中一项看字节码的数据是否以“魔数cafe”以及当前的JVM的运行JDK版本
是否可以运行。向下兼容,反过来不行。
(2)准备:给成员变量(类变量/静态变量给默认值),把常量(final)等值在方法区的
常量池准备好
(3)解析:理解为把类中的对应类型名换成该类型的class对象的地址
String --》String类型对应的Class地址
3.初始化<clinit>,以下两个部分
(1)静态变量的显式初始化代码,赋值代码
(2)静态代码块
哪些操作会导致类的初始化?这句话的意思是,类的加载不一定会发生类初始化。大多数
时候都会初始化
(1)main方法所在的类在加载时,直接初始化。
(2)new一个类的对象
(3)调用该类的静态变量(final常量除外)和静态方法
(4)使用java.lang.reflect包的方法对类进行反射调用
(5)初始化一个类,如果其父类没有被初始化,则会先初始化其父类
哪些操作不会导致类的初始化?
(1)引用静态常量时(final)不会触发此类的初始化
(2)当访问一个静态域时,只有真正声明这个域的类才会初始化,换句话说,通过子类访
问父类的静态域时,只会初始化父类,不会初始化子类
(3)通过数组定义类引用,不会触发类初始化
哪些操作会导致类的初始化?
这句话的意思是,类的加载不一定会发生类初始化。虽然大多数时候都会初始化。
(1)main方法所在的类在加载时,直接初始化。
(2)new一个类的对象
(3)调用该类的静态变量(final常量除外)和静态方法
(4)使用java.lang.reflect包的方法对类进行反射调用
(5)初始化一个类,如果其父类没有被初始化,则会先初始化其父类
哪些操作不会导致类的初始化?
(1)引用静态常量时(final)不会触发此类的初始化
(2)当访问一个静态域时,只有真正声明这个域的类才会初始化,换句话说,通过子类访
问父类的静态域时,只会初始化父类,不会初始化子类
(3)通过数组定义类引用,不会触发类初始化
无论如何,类的加载结果:在方法区有一个唯一的Class对象来代表一个类型
类加载器
1.类加载器是负责加载类的对象。
2.每个 Class 对象都包含一个对定义它的 ClassLoader 的引用。
共有四种类加载器:
(1)引导类加载器:用C++编写的,是JVM自带的类装载器,负责Java平台核心库,用
来装载核心类库。该加载器无法直接获取
(2)扩展类加载器:负责jre/lib/ext目录下的jar包或 –D java.ext.dirs 指定目录下的jar包
装入工作库
(3)应用程序类加载器:负责java –classpath 或 –D java.class.path所指的目录下的类与
jar包装入工作 ,是最常用的加载器
(4)自定义类加载器(一般两种情况会用到):
双亲委派机制
字节文件需要加密解密
加载特定目录下的类
关系:4,3,2,1 4认3为parent加载器,但不是继承关系
|