8.1.17使用1.2版本的用户自定义类装载器

8.1.17使用1.2版本的用户自定义类装载器

前一节描述的类装载器最初是为1.1版虚拟机设计的,但也可以在1.2版本中工作。虽然1.2版 本为java.lang.ClassLoader加人了默认的loadClass ()具体实现,这个具体的方法仍然可以被子 类所覆盖。因为loadClass ()的工作方式从版本1.1到版本1.2没有变化,所以老式的采取覆盖 loadClass ()方式的用户自定义类装载器仍然可以在版本丨.2中正常工作。

loadClass ()的基本工作方式是:给定需要查找的类型的全限定名,loadClass ()方法会 用某种方式找到或者生成字节数组,里面的数据采用Java class文件的格式(用该格式定义类型)。 如果loadClass ()无法找到或者生成这些字节,它会拋出ClassNotFoundException异常。否则, loadClass ()会传递这个字节数组到类ClassLoader声明的某一个defineClass ()方法。通过把 字节数组传递给defineClass( ),loadClass ()会要求虚拟机把传入的字节数组导入到这个用户 自定义的类装载器的命名空间中去。在版本1.2中,当loadClass()调用defineClass ()的时候, 它可以指定这个类型数据所属的保护域。当类装载器的loadClass ()方法成功地装载了类型时, 它返回代表这个新装载的类型的java.lang.class对象。

java.lang.ClassLoader类中的loadClass ()的具体实现通过如下步骤来实现loadClass ()方 法的工作方式。

1)查看是否请求的类型已经被这个类装载器装载进命名空间了(通过findLoadedClass () 方法)。如果的确如此,返回这个已经装载的类型的Class实例。

2)否则,委派到这个类装载器的双亲装载器。如果双亲返回了一个Class实例,就把这个

Class实例返回。

3)否则,调用findClass ( ),findClass ()会试图寻找或者生成一个字节数组,内容采用 Java class文件格式(它定义了所需的类型)。如果成功,findClass ()把这个字节传递给
defineClass (),后者试着导人这个类型,返回一个Class实例。如果findCIass ()返回了一个 Class实例,loadClass ()就把这个Class实例返回。

4)否则,findClass ()抛出某些异常来中止处理,而且loadClass ()也抛出同样的异常并 中止。

虽然在版本1.2中仍然可以生成ClassLoadcr的子类并且覆盖loadClass ()方法,但是在版本 1.2中创建自定义的类装载器时,推荐采用生成ClassLoader的子类并实现findClass ()方法的方 式。findClass ()方法看上去像这样:

// A method declared in class java.lang.ClassLoader

protected Class findClass(String name) throws ClassNotfoundException;

findClass ()方法的基本工作方式是:findClass ()接受需要装载的类型的全限定名作为惟 —的参数。findClass ()首先试图査找或者生成一个字节数组,内容是Java class文件格式(格 式定义了所需要装载的类型)。如果findClass ()无法确定或者生成字节数组,它抛出 ClassNotFoundException异常并中止。否则,findClass ()调用defineClass (),把所需的类型名宇、字节数组和一个可选的指定了这个类型所属的受保护域的protectionDomain对象作为参数。 如果defineCIass ()返回了一个代表这个类型的Class实例,findClass ()简单地把同一个Class 实例返回给它的调用者。否则,defineClass ()抛出某些异常并中止,findClass ()也拋出同样 的异常并中止。

下面是一个采取覆盖findClass ()方法(而不是覆盖loadClass ()方法)的GreeterClass Loader 版本:

字符串变量是GreeterChssLoader的单参数构造方法所需的惟一参数。因为这个单参数的构造方 法没有接受指向调用者定义的双亲类装载器的引用,所以这个类装载器无法调用使用用户自定 义类装载器引用的超类构造方法。也就是说,它简单地默认调用超类的无参数版本的构造方法, 这会使这个类装载器的双亲设置为系统类装载器。另外一个构造方法(两参数构造方法)除了

猜你喜欢

转载自www.cnblogs.com/mongotea/p/11979775.html