JAVA程序的类加载及其反射机制

http://tech.ddvip.com   2007年08月31日    社区交流

内容摘要:JAVA中类文件加载是动态的。JVM指令是被封装在了. class文件里面,而.class文件的加载过程是动态的,也就是说当我们用到的时候才会去加载,如果不用的话,就不会去加载我们的类。

  JAVA为我们提供了两种动态机制。第一种是隐式机制。其实new一个对象和调用类的静态方法时,就是隐式机制在工作。第二种是显示机制。显示的机制又有两种策略(第一种是用java.lang.Class的forName(String str)方法,第二种是用java.lang.ClassLoader的loadClass())。

  第一种:利用forName方法

  当我们查API文档就会发现forName方法有两种形式。分别如下:

public static Class<?> forName(String className)
throws ClassNotFoundException
public static Class<?> forName(String name,
boolean initialize,
ClassLoader loader)
throws ClassNotFoundException

  先来说说第二种方法:第二个方法值得注意的就是第二个参数boolean initialize,如果我们把这个参数设置为false,那么当我们加载完类后就不会执行静态代码和静态的初始化动作。只有当我们new一个对象的时候才会初始化。而第三个参数是用来指明类的加载器的。

  如果查看java.lang.Class类的源代码,上述两种方法最终都会调用Class类中的私有的native方法forName0(),此方法的声明如下:

private static native Class forName0(String name, boolean init , ClassLoader loader)
throws ClassNotFoundException;

  所以当我们调用Class.forName(name )时,其实是在方法内部调用了:

forName0(name, true, ClassLoader.getCallerClassLoader());

  当我们调用Class.forName(name, initialize, loader )的时候,实际上此方法内部调用了:

forName0(name, initialize, loader);

  下面看一个例子,如果方法中第二个参数为false的情况:

责编:豆豆技术应用

正在加载评论...