(旧文整理)彻底搞懂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了。
此时我们就要用全反射的方式来使用这个实例,接下来讲解这个方式。
使用反射的方式来调用类的实例
最后看一下使用反射的方式进行:
- 加载class
- 生成class的实例
- 调用实例里面的方法
下面是代码:
可以看到我们使用了自己制作的classLoader进行class的加载,并且完全使用了反射的方法去使用加载的class的实例,调用它的show()
方法。以下是程序的输出:
从输出可以看到整个的class的加载过程。
以上就是对Java里面class loading的全部说明。
本文用到的代码样例在这里:
- 上一篇 k3s学习笔记(三)
- 下一篇 k3s学习笔记(四)