我们本篇先了解类装载器的基础,重点说的是:static什么时候初始化**
下一篇我们就可以深入Java的类装载器,我们先看看有几种方法载入类。
一.想必大家都知道用new这个关键字:
B.java文件:
class B
{
static{
System.out.println("--B--");
}
public void start()
{
System.out.println("--start--");
}
}
a.java文件:
public class a
{
public static void main(String [] args)
{
System.out.println("--a--");
B b=new B();
B c=new B();
}
}
我们执行的结果:
强调内容
1.先 javac a.java
2.在 java -verbose a
3.出现了上图,接下来的执行结果也是按这步骤来的
如上图得知:
1.B类new了2个对象,但是只载入一次
2.static区也只初始化一次
2.大家应该也从JDBC中得知用class.forName();
forNama()函数有一个参数的。还有3个参数的,重点就在这里:
1.一个参数的:
a.java文件:
public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
class.forName("B");
}
}
使用class.forNmae要throws 异常
结果:
分析:
1.结果跟上面一样
2.使用forName(“B”,true,a.class.getClassLoader());也跟上面一样
3.使用forName(“B”,false,a.class.getClassLoader());
a.java代码:
public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
Class.forName("B",false,a.class.getClass.Loader());
}
}
结果:
分析:
1.a类,B类载入了,但是static没有初始化???
我们把a.java代码换一下:
public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
Class c= Class.forName("B",false,a.class.getClassLoader());
B d=(B) c.newInstance();//时例化一个对象
}
}
结果:
分析:
1.static的结果出来了,难道static的初始化是第一次实例化的时候吗??
我们接下来看第3种载入方法,看看是不是这个结果
三.Classloader的loadClass()
a,java的代码:
public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
a.class.getClassLoader().loadClass("B");
}
}
结果:
分析:
1.a,B类都载入了,但是static没有初始化,我们现在创建一个对象看看
a.java的代码:
public class a
{
public static void main(String [] args) throws Exception
{
System.out.println("--a--");
Class b= a.class.getClassLoader().loadClass("B");
B c=(B) b.newInstance();
}
}
结果:
分析:
1.static初始化了
总结: