最近我一直在寻找在运行时将 jar 文件动态加载到我的应用程序中的方法。
我已经多次遇到过某个解决方案,它基本上是一个获取系统类加载器并使用反射访问其他 protected addURL 方法的“hack”,以便在运行时将其他文件添加到原始类路径。据推测,该解决方案工作得非常好,并且避免了在编写和使用自制的自定义类加载器时出现的问题。
看起来像这样:
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”时会遇到什么样的麻烦?
谢谢
最佳答案
主要的危险是您依赖于方法存在的运行时检查。
如果方法签名在未来发生变化,您直到运行时才会知道。如果没有提供替代方法,这也可能导致糟糕的情况。
此外,正如 huge 已经指出的那样,设计者选择使方法 protected
是有原因的(除了缺乏深思熟虑之外)
关于java - 在运行时使用反射将文件添加到类路径的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13102595/