在运行时修改类路径 - 控制类加载顺序

时间:2011-02-14 11:17:43

标签: java classpath

是否可以在运行时控制已加载类的顺序?例如:我有两个jaras类SomeClass:SomeLibrary-1.0.jar和SomeLibrary-2.0.jar。该类具有静态方法getVersion(),它返回SomeLibrary的当前版本。我使用解决方案here来修改运行时的类路径。现在,当我运行代码时:

public static void main(String[] args) {
    ClassPathHacker.addFile("SomeLibrary-1.0.jar");
    ClassPathHacker.addFile("SomeLibrary-2.0.jar");
    System.out.println(SomeClass.getVersion());
}

我希望看到输出2.0,但有1.0。这是因为类加载器使用类路径中的第一个类。是否可以控制已加载类的执行者或已经加载的“覆盖”类?

1 个答案:

答案 0 :(得分:1)

您需要使用不同ClassLoader实例的同一JAR的两个版本。在这种情况下,攻击SystemClassLoader对你没有帮助。

例如,您可以在其自己的URLClassLoader实例中加载每个jar:

URLClassLoader ucl1 = new URLClassLoader(new URL[] { new URL("SomeLibrary-1.0.jar") });
URLClassLoader ucl2 = new URLClassLoader(new URL[] { new URL("SomeLibrary-2.0.jar") });

Class<?> cl1 = ucl1.loadClass("org.example.SomeClass");
Class<?> cl2 = ucl2.loadClass("org.example.SomeClass");

Method m1 = cl1.getMethod("getVersion");
System.out.println("v1: " + m1.invoke(cl1));
Method m2 = cl2.getMethod("getVersion");
System.out.println("v2: " + m2.invoke(cl1));