我想问一下UrlClassLoaders。我写了一个主要的.jar文件,效果很好。现在我想让它能够从其中一个文件夹加载插件。我写了它,直到找到文件夹中的.jar文件,可以在里面列出他们的类(他们的名字,路径)。问题是,当我要求他找到该类(用于创建它的实例)时,他们将找不到它从我的主jar文件继承的类:
IN MAIN JAR:
-class Expansion { ... }
In a plugin jar:
-class ExpansionA extends MainJar.Expansion { ... }
因此,当我要求UrlClassLoader解析“ ExpansionA ”类时,它将在插件jar中搜索“ Expansion ”类而不是MainJar,并且插件jar中没有“ Expansion ”类,因为它从MainJar作为资源库继承...并且在 defineClass 方法时抛出NoDefFoundForClassError异常。我怎么能告诉他在MainJar上课后检查呢? (它不仅仅是一个类,但我希望插件能够继承MainJar中的任何类)。你可以帮帮我吗?
答案 0 :(得分:1)
ClassLoader
有一个父级,首先委派加载请求。要确保您创建的新类加载器可以访问类Expansion
,您应该将新ClassLoader
的父级设置为类ClassLoader
的{{1}}:
Expansion
URLClassLoader
ClassLoader myLoader=new
这不仅可以确保(urls, Expansion.class.getClassLoader());
类找到Expansion
类,还可以保证它解析为同一个运行时类(首先询问父类)。如果插件jar包含类的副本,这很重要。