是否可以在运行时控制已加载类的顺序?例如:我有两个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
。这是因为类加载器使用类路径中的第一个类。是否可以控制已加载类的执行者或已经加载的“覆盖”类?
答案 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));