1

我希望系统类加载器接管我的应用程序的类加载。所以,如果我运行我的程序,

java -Djava.system.class.loader=MyClassLoader Main

我希望 Main 由 MyClassLoader 加载,以便我可以控制应用程序中的类加载。但这不会发生。Main 仍由默认系统类加载器 (sun.misc.Launcher$AppClassLoader) 加载,Main 引用的其他类也是如此。但是,对 getSystemClassLoader() 的调用会返回 MyClassLoader 的一个实例。

这有什么用?由我的自定义系统类加载器加载 Main 是否有意义?如何控制我的应用程序的类加载?谁使用 getSystemClassLoader() 值?

4

1 回答 1

1

如果您只是URLClassLoader在没有覆盖的情况下进行子类化,那么这是您应该期望的记录在案的行为

在第一次在父类加载器中搜索之后,将按照为类和资源指定的顺序搜索 URL。

如果父类加载器可以加载该类,那么它会这样做,并且为该类报告的加载器将是父类加载器。为了恢复这个作为 Java 类加载器默认的父优先类加载策略,您必须覆盖loadClass.

于 2012-11-11T11:42:36.427 回答