我希望系统类加载器能够为我的应用程序接管类加载。所以,如果我运行我的程序,
java -Djava.system.class.loader=MyClassLoader Main
我希望Main可以通过MyClassLoader加载,这样我就可以控制应用程序中的类加载。但这不会发生。 Main仍然由默认的系统类加载器(sun.misc.Launcher $ AppClassLoader)加载,以及从Main引用的其他类。但是,对getSystemClassLoader()的调用将返回MyClassLoader的实例。
这有用吗?我的自定义系统类加载器加载Main是否有意义?如何控制应用程序的类加载?谁使用getSystemClassLoader()值?
答案 0 :(得分:1)
如果您只是将URLClassLoader
子类化而没有覆盖,this is the documented behaviour you should expect:
首次在父类加载器中搜索后,将按照为类和资源指定的顺序搜索URL。
如果父类加载器可以加载该类,那么它会这样做,并且为该类报告的加载器将是父类加载器。为了还原此父级优先类加载策略(Java类加载器的默认值),您必须覆盖loadClass
。