java初学者关于加载器的问题

img

img

img

Message里面只有一个send()方法输出一句话

我的问题是:
1.写了一个简单的测试类(Message)
2.将其从包中拿出来后编译(原包中没有了这个文件),通过自定义类的加载器执行编译后的文件
3.这个时候类实际并不存在此包中,也就是包没用了
问题:但是为什么写加载器的时候加上了包名(cn.ceshi.Message)才能正常运行,包不应该没用了么?跳过包的话为什么还要加包名,这样也就是说包并没有被跳过。这样的话我完全可以在外面运行的时候删掉Package这句话,那这个加载器的意义在哪,说是跳过了实际还是要写上这个类之前的包名,有种多此一举的感觉,还是说这个加载器就是相当于Message里Package这句话。那我在别的地方写类的时候写自己现在所在的包不就好了,写个cn.ceshi包名再通过加载器来写上这个包不是闲的。

那肯定咯。不然包的意义在哪里?就是为了区分各种类的重名现象,就如你这个Message,光一个Message,就有很多类重名,你不加包名,怎么区分各个Message?你单单这样看,就和import的效果其实差不多。但是如果你需要做一些动态的修改,比如你一个jar包做完了之后,希望有很多动态添加的功能,你就可以用你上面这种加载的方式,jar包不需要修改,只需要改外部的.class就行了

img
当我们实例化类加载器时,我们可以将父类加载器指定为构造函数参数。如果未显式指定父类加载器,则会将虚拟机的系统类加载器指定为默认父类。
类加载器层次结构不是继承层次结构,而是委托层次结构。大多数类加载器在搜索自己的类路径之前将查找类和资源委托给其父类。如果父类加载器找不到类或资源,则类加载器只能尝试在本地找到它们。实际上,类加载器只负责加载父级不可用的类;层次结构中较高的类加载器加载的类不能引用层次结构中较低的可用类。类加载器委托行为的动机是避免多次加载同一个类。