JAVA学习之反射——类加载

来源:互联网 发布:万方数据库步骤 编辑:程序博客网 时间:2024/05/24 04:31


类加载就是将类的class文件读入内存,并为之创建一个java.lang.Class对象。

1.类的初始化的时机

(1)创建类的实例:通过new操作符来创建实例,通过反射来创建实例,通过反序列创建。

(2)调用某个类的静态方法

(3)初始化某个类的子类,当初始化某个类的子类时,该子类的所有父类也同时会被初始化

需要注意的是:

对于final型的静态属性,如果该属性可以在编译时得到属性值,则可认为该属性是编译时属性,不会导致该类的初始化。例如:


class Tester {static{System.out.println("Tester类的静态初始化块);}static final String comileConstant="初始化";}public void TestCompileConstant{public static void main(String[] args){System.out.println(Tester.comileConstant);}}

运行下面的程序,由于变量在编译时就被替换了,所以上面的程序并不能实现对Tester的初始化


反之,如果final类型的静态属性的值不能在编译时就确定,必须等到运行时才能确定。则将会导致该类被初始化。

class Tester {static{System.out.println("Tester类的静态初始化块);}static final String comileConstant=System.currentTimeMillis()+"";}public void TestCompileConstant{public static void main(String[] args){System.out.println(Tester.comileConstant);}}



2.类加载器

类加载器有三个层次:Bootstrap ClassLoader根类加载器,Extension ClassLoader扩展类加载器,System ClassLoader系统类加载器

System ClassLoader:加载路径是程序运行的当前路径

Extension ClassLoader:一般在ext文件夹下C:\Program Files\Java\jre1.8.0_20\lib\ext;

Bootstrap ClassLoader:负责加载JAVA的核心类

3.自定义加载器

自定义加载器感觉比较复杂,所以就介绍几个重要的方法吧

(1)loadClass(String name,boolean resolve)该方法是ClassLoader的入口,根据指定的二进制名称加载类,系统就是调用该方法获取指定类的Class对象

(2)findClass(String name)根据二进制名称查找类

(3)Class defineClass(String name,byte[] b,int off,int len)该方法可以将指定类的字节码文件(即class文件)读入字节数组,并把它转化为Class对象

loadClass的执行步骤:

(1)用findLoaderClass()检查是否已经加载,如果已经加载则直接返回

(2)在父类加载器上调用loadClass方法,

(3)调用findClass来查找类

所以在自定义加载类时,一般都是重写findClass方法



0 0
原创粉丝点击