最近我一直在寻找在运行时将 jar 文件动态加载到我的应用程序中的方法。
我已经多次提出某个解决方案,这基本上是一个“hack”,它获取系统类加载器并使用反射来访问受保护的 addURL 方法,以便在运行时将其他文件添加到原始类路径。这个解决方案据说效果很好,并且避免了编写和使用自制自定义类加载器时出现的问题。
它看起来像这样:
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
我的问题如下:我认为首先使 addURL 方法受到保护是有充分理由的,在动态地将文件添加到类路径时一定存在某种缺陷或危险。
除了假设系统类加载器总是一个 URLClassLoader,“应该总是这样”(TM),使用这个“hack”时我会遇到什么样的麻烦?
谢谢