同时,我们重写了这个classloader的行为,重写后的行为如下:遇到要加载的类时,自己优先加载,也就是会去自己的两个url里面找,看看能不能找到,如果找不到,就会进入异常,异常被我们捕获后,交给parent classloader去加载;
1.3处,我们用新建的classloader,去加载了插件的实现类
1.4处,利用1.3处加载的实现类的class,反射生成对象,强转为MojoInterface接口对象
1.5处,多态方式执行插件逻辑
大家不妨思考下,大家觉得,最终的执行结果是啥?我们的“hello world”能打印出来吗?
这个代码,我们上传了gitee,大家可以拉下来看。
https://gitee.com/ckl111/maven-3.8.1-source-learn
我这边给大家展示下,执行结果:
大家看看,这像话吗,明明我的插件代码里,是实现了接口的,怎么就不能向上转型呢?:
public class MyMojoImplementation implements MojoInterface{ @Override public void execute() { System.out.println("implementation execute business logic"); } }这个。。。怎么说呢。。。这么跟你解释吧,我们加载MyMojoImplementation时,发现这个类吧,还实现了接口MojoInterface,那么,这个接口类也就需要加载,因为我们classloader进行了改写(优先由自己进行加载),因此,最终呢,MojoInterface也就和MyMojoImplementation一样,都是由插件类加载器去加载的。
最终呢,在向上转型时,会出现下边这个情况,两边不匹配,就报错了。
MojoInterface(框架中的这个类,是由框架的类加载器加载的) mojoInterface = (MojoInterface) implClazzByPluginClassloader.newInstance();(这个实现类实现的接口,是由插件类加载器加载的) 课后题我们对代码进行了修改,改成了如下的样子,结果,就可以跑通我们的hello world了。这又是为啥呢?