Java类加载器只会在某些特定的情况下才会执行类的加载
以下是经过验证的梳理,如有纰漏请指正
1、new一个对象时
2、使用反射创建对象时
注意,执行Class.forName(a.b.MyObject)语句时会加载相应类对象,而执行MyObject.class语句时则不会加载相应类对象
3、访问类静态部分(静态字段和代码)
注意,访问用final static修饰的String或基本数据类型(不包含包裹对象,如Integer等)时,不会触发被访问类的加载。原因在于String或基本数据类型在javac编译时会将常量生成 ConstantValue属性,引用方的类加载时会直接根据ConstantValue设值,无需加载被引用类
4、main方法所在的类作为程序执行的入口会首先被加载
5、要加载子类时会首先去加载其父类
6、通过子类去访问其父类的静态部分时,不会触发子类的加载
注意,此点与第3点中的ConstantValue并不矛盾,也即通过子类访问父类的静态部分时,有可能两者都不被加载
7、声明数组时不会执行对应类加载,如执行MyObject[] arr = new MyObject[5];时
网友评论