java - 在运行时使用反射将文件添加到类路径的危险

标签 java reflection classloader

最近我一直在寻找在运行时将 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/

相关文章:

java - 为 adempiere zk Web ui 框架实现静态 id 生成

java - Apache CXF 客户端访问多个资源

java - Java 中的 Volatile 关键字

c# - 如何使用属性将方法作为表达式传递?

java - 奇怪的 jboss 控制台错误

java - 如何在不使用 Future.get() 的情况下使 Java 中的 Future 超时,因为它是一个阻塞操作?

java - 在 Clojure 中调用不带参数的 Java 实例方法

java - 如何删除正在执行的jar文件

websphere - WAS 8.5中违反了类加载约束

java - 我的程序正在访问哪些库?