类加载
类加载,先解决下面几个问题
1. 什么是类加载
2. 类在时候加载
3. 类怎么进行加载
4. 双亲委派机制
1. 类为什么要加载
我们写的代码 .java , 会被编译成 .class文件 , 然后 被jvm虚拟机进行解释执行。 .class文件是在磁盘当中的, 需要将其加载到内存当中,才能解释执行,这就是类加载
2. 类在什么时候进行加载
类会在第一次使用它的时候进行加载,具体表现为:
1) 当调用 new关键字来创建对象,发现 类还没有加载到内存中时
2) 当创建子类实例, 发现父类的 类信息还没有加载到内存时
3) 进行反射调用时 【 1- 3 其实都是要用到 Class对象来创建实例,所以找不到Class对象就会进行类的加载】
4) 调用类的静态方法或者使用类的静态属性
5) main 函数所在的类会在程序启动的时候自动进行加载
3. 类怎么进行加载
类通过类加载器来进行加载。
类加载的过程:
1) 加载 通过类的全路径名来获取这个类二进制字节流(不一定通过Class文件得到!!!),将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;在内存中生成一个代表这个类的Class对象,这里的内存指的是 堆内存。(那么是放在堆内存里面的哪个区域呢???)
2)验证:确保Class文件的字节流中包含的信息符合 java虚拟机规范的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全!
3)准备:为类中定义的变量(指的是静态变量!!)分配内存并设置类变量的初始值!! (JDK1.8之前,使用永久代来实现方法区,所以是类变量存放在永久带中的,jdk1.8之后,取消了永久代,类变量存放到 堆内存中!!!!!)
4) 解析: 将常量池内的符号引用替换为直接引用。
5)初始化:( 类的初始化!!!不是创建实例对象!! ) 为类变量赋初值,也就是我们在代码中编写的值,前面准备阶段为类变量赋的初值是默认的初始值!
4. 双亲委派机制
类加载器: 启动类加载器 扩展类加载器 应用程序类加载器 自定义类加载器
双亲委派机制就是 : 如果一个类加载器收到了加载类的请求,不会立刻进行类的加载,而是将类的加载请求委派给上一级类加载器进行加载,每一层都是如此,当父类加载器没法进行类的加载时,子类加载器才会进行类的加载。
5. 破坏双亲委派机制
6. 为什么要自己定义类加载
1. 加密 java代码很容易被反编译,如果不想被轻易的反编译,可以对编译后的代码进行加密操作,那么就需要自己定义类加载器,将编译后的代码进行解密还原。
2. 字节码所在的位置 如果字节码所在的位置不是在本机上面,那么需要自定义类加载器,从指定的来源进行类的加载。
浙公网安备 33010602011771号