(旧文整理)彻底搞懂Java ClassLoader(七)

本文是这个系列文章的::最后一篇::,介绍几种不同的class的加载方式。

首先是第一种:

在同一个ClassLoader中加载Class

在同一个ClassLoader中加载Class很简单,在程序的上下文环境里直接调用class就行了。下面是样例代码:

在上面的代码里面,我们使用了DirectLoading.class.getClassLoader()得到了当前正在执行的class加载所使用的classLoader,然后使用同一个classLoader去加载ProductImpl这个class。

这样,我们加载出来的class在代码环境里面是使用的同一个classLoader,因此也在同一个上下文的环境中,所以可以直接通过:

ProductImpl impl = (ProductImpl) clazz.getDeclaredConstructor().newInstance();

newInstance()方法生成的::实例::cast成ProductImpl的class。

执行上面的代码的输出如下:

上面这种方法在使用同一个classLoader的时候是有效的,但是如果是像上一篇文章讲的那样,在使用不同的classLoader加载class的时候,不同的loader加载的class所创建的实例,就无法直接cast成::当前上下文环境下::的同一个class了。

此时我们就要用全反射的方式来使用这个实例,接下来讲解这个方式。

使用反射的方式来调用类的实例

最后看一下使用反射的方式进行:

下面是代码:

可以看到我们使用了自己制作的classLoader进行class的加载,并且完全使用了反射的方法去使用加载的class的实例,调用它的show()方法。以下是程序的输出:

从输出可以看到整个的class的加载过程。

以上就是对Java里面class loading的全部说明。

本文用到的代码样例在这里:

Powered by Jekyll and Theme by solid