6

最近我一直在寻找在运行时将 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”时我会遇到什么样的麻烦?

谢谢

4

1 回答 1

1

主要危险是您依赖于对方法存在的运行时检查。

如果将来方法签名发生变化,您将在运行时才知道它。如果没有提供替代方法,这也可能会导致令人讨厌的情况。

此外,正如巨大的已经指出的那样,设计师选择制作这种方法protected是有原因的(除了缺乏远见)

于 2012-10-27T19:35:02.147 回答