如何按加载顺序重写java类?

如何按加载顺序重写java类?,java,class,jar,Java,Class,Jar,可能有两个JAR具有相同的类名。是否可以控制JVM将加载(使用)哪个类? 谢谢。这是可能的,它只需加载类路径上首先出现的一个。如果有两个jar具有相同的类,则加载哪一个取决于jar的顺序。您还可以创建自己的类加载器,并将其链接到父类加载器。因此,类加载器将尝试加载该类,如果失败,它将返回到父类。以这个为例:我从未尝试过,但我相信类路径中包含该类的第一个jar将是使用的jar,也就是说,您可以通过将jar按该顺序放在类路径上来控制加载哪个类。尽管如此,这可能不是一个好主意……这不会带来任何好处。往

可能有两个JAR具有相同的类名。是否可以控制JVM将加载(使用)哪个类?
谢谢。

这是可能的,它只需加载类路径上首先出现的一个。

如果有两个jar具有相同的类,则加载哪一个取决于jar的顺序。您还可以创建自己的类加载器,并将其链接到父类加载器。因此,类加载器将尝试加载该类,如果失败,它将返回到父类。以这个为例:

我从未尝试过,但我相信类路径中包含该类的第一个jar将是使用的jar,也就是说,您可以通过将jar按该顺序放在类路径上来控制加载哪个类。尽管如此,这可能不是一个好主意……这不会带来任何好处。往回走罐子的顺序是什么?事实上这是不正确的。如果使用URLClassLoader,首先使用父类加载器查找类。如果找不到指定的类,则只使用子类。通常情况下,JAR的顺序取决于它们在类路径(如果显式声明)中的定义方式。如果使用目录扫描类加载器,例如在ApacheTomcat内部运行时,文件顺序取决于操作系统。它通常按字母顺序排列,但你无法控制。是的,布鲁诺是正确的。在自己尝试之前,首先让父类加载器尝试加载该类是相当重要的。否则,当其他类尝试访问该类时,您可能会得到非常奇怪的结果。如果你真的知道自己在做什么并且完全控制了使用相关类的整个应用程序,我想你可能会违反这一点,但这似乎不是最好的主意。Voo,是的,你可以通过实现自定义类加载器和重写某些方法(findClass?记不清了)来违反这一点。我在玩某种动态插件系统时做过一次(为了将不同的插件隔离到不同的类加载器中,并且能够从内存中卸载它们的所有类,并在插件停用后释放PermGen,避免OOM;就像Tomcat在重新部署应用程序时所做的那样)。这是一个非常特殊的需求,我们必须很好地理解类加载在Java中是如何工作的,才能正确地完成它?字母顺序?第一个是-cp选项中的第一个:java-cp firstJar.jar;secondJar.jar。。。例如,如果JAR是由web容器从web-INF/lib动态加载的,那么我认为没有指定它。你必须检查一下集装箱。但我不会指望这个。