【问题标题】:How to load all classes of a jar file at runtime?如何在运行时加载 jar 文件的所有类?
【发布时间】:2011-11-26 03:48:38
【问题描述】:

根据this question,可以从jar文件中加载一个类:

ClassLoader loader = URLClassLoader.newInstance(
    new URL[] { jarFileURL },
    getClass().getClassLoader()
);
Class<?> clazz = Class.forName("mypackage.MyClass", true, loader);

如何加载 jar 文件中包含的所有类?

【问题讨论】:

  • 你到底为什么要这样做?
  • 过早优化?不能容忍代码关键部分的延迟?无论哪种方式,在这种情况下,最好只在关键部分之前为每个“关键”对象创建一个对象。
  • 这是一个实际的用例:如果你写了一个像 getdown (code.google.com/p/getdown) 这样的更新工具并替换了你自己的 jar(忽略这可能有点脆弱),我们尝试的类加载器会失败加载一个新类(因为文件句柄可能无效)。如果我们在更新程序结束之前预加载所有需要的类,我们就可以了。
  • 这是另一个实际用例:bugs.java.com/bugdatabase/view_bug.do?bug_id=8022063中记录的类加载器错误的解决方法
  • @mcfinnigan 如果您想验证您的类是否可以在构建时(而不是运行时)加载(=未损坏)。

标签: java jar runtime classloader urlclassloader


【解决方案1】:

类加载器会在需要时立即加载一个 .class 文件。如果不需要,则不会加载。

为什么你认为你的方法会比类加载器已经做的更好?

【讨论】:

  • "类加载器将在需要时立即加载一个 .class 文件"。感谢您的信息。
  • 另一个很好的案例,回答字面问题不是一个好主意 (+1)
  • 回答这个问题会更有帮助。这是一种非常有效的方法,例如,在启动时加载大量用户创建的插件时。
【解决方案2】:

您必须将其作为 zip 文件打开,检查名称,假设所有以 .class 结尾的条目都是类文件并加载它们,忽略嵌套类等。

但是....为什么?

【讨论】:

  • 如何忽略嵌套类
【解决方案3】:

如果您真的想动态读取类,请将其留给已经实现该功能的专业人士。实现自己的类加载器很困难。相信我。我已经尝试了几次。改用 OSGi 之类的东西,它可以为您提供动态类加载等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2012-10-20
    • 2023-03-10
    • 2010-09-16
    • 2014-07-30
    • 2022-01-01
    • 2015-09-05
    • 1970-01-01
    相关资源
    最近更新 更多