| public Class loadClass( String name, boolean resolve ) throws ClassNotFoundException ...{ try ...{ // 我们要创建的Class对象 Class clasz = null; // 必需的步骤1:假如类已经在系统缓冲之中, // 我们不必再次装入它 clasz = findLoadedClass( name ); if (clasz != null) return clasz; // 下面是定制部分 byte classData[] = /**//* 通过某种方法获取字节码数据 */; if (classData != null) ...{ // 成功读取字节码数据,现在把它转换成一个Class对象 clasz = defineClass( name, classData, 0, classData.length ); } // 必需的步骤2:假如上面没有成功, // 我们尝试用默认的ClassLoader装入它 if (clasz == null) clasz = findSystemClass( name ); // 必需的步骤3:如有必要,则装入相关的类 if (resolve && clasz != null) resolveClass( clasz ); // 把类返回给调用者 return clasz; } catch( IOException ie ) ...{ throw new ClassNotFoundException( ie.toString() ); } catch( GeneralSecurityException gse ) ...{ throw new ClassNotFoundException( gse.toString() ); } } |
Listing 2显示了一个简单的loadClass实现。代码中的大部分对所有ClassLoader对象来说都一样,但有一小部分(已通过注释标记)是特有的。在处理过程中,ClassLoader对象要用到其他几个辅助方法:
findLoadedClass:用来进行检查,以便确认被请求的类当前还不存在。loadClass方法应该首先调用它。
defineClass:获得原始类文件字节码数据之后,调用defineClass把它转换成一个Class对象。任何loadClass实现都必须调用这个方法。
findSystemClass:提供默认ClassLoader的支持。假如用来寻找类的定制方法不能找到指定的类(或者有意地不用定制方法),则可以调用该方法尝试默认的装入方式。这是很有用的,非凡是从普通的JAR文件装入标准Java类时。
resolveClass:当JVM想要装入的不仅包括指定的类,而且还包括该类引用的所有其他类时,它会把loadClass的resolve参数设置成true。这时,我们必须在返回刚刚装入的Class对象给调用者之前调用resolveClass。
评论加载中…
![]() |