Java 如何在运行时加载jar文件的所有类?

Java 如何在运行时加载jar文件的所有类?,java,jar,runtime,classloader,urlclassloader,Java,Jar,Runtime,Classloader,Urlclassloader,根据,可以通过以下方式从jar文件加载类: ClassLoader loader = URLClassLoader.newInstance( new URL[] { jarFileURL }, getClass().getClassLoader() ); Class<?> clazz = Class.forName("mypackage.MyClass", true, loader); ClassLoader=URLClassLoader.newInstance(

根据,可以通过以下方式从jar文件加载类:

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

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

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


但是……为什么?

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


但是……为什么?

类加载器将在需要时加载.class文件。如果不需要,就不会加载


为什么您认为您的方法会比类加载器已经完成的工作有所改进?

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



为什么你认为你的方法会比类加载器已经做的有所改进?

如果你真的想动态地阅读类,那就让那些已经实现了这一点的专业人士来做吧。实现自己的类加载器很难。相信我。我已经试过几次了。改用OSGi之类的工具,它可以为您提供动态类加载和更多功能。

如果您真的想动态读取类,请将其留给专业人士,他们已经实现了这一点。实现自己的类加载器很难。相信我。我已经试过几次了。改用OSGi之类的工具,它为您提供动态类加载和更多功能。

您到底为什么要这样做?过早优化?不能容忍关键代码部分的延迟?无论如何,在这种情况下,最好在关键部分之前为每个“关键”对象创建一个对象。下面是一个实际的用例:如果您编写一个更新工具,如getdown()并替换自己的jar(忽略这可能有点脆弱),那么我们尝试的类装入器无法加载新类(因为文件句柄可能无效)。如果我们在更新程序结束前预加载所有需要的类,我们就可以了。下面是另一个实际使用案例:如果您想验证您的类是否可以在构建时(而不是运行时)加载(=未断开),请在@mcfinnigan中记录classloader错误的解决方法。你到底为什么要这样做?过早的优化?不能容忍关键代码部分的延迟?不管怎样,在这种情况下,最好在关键代码部分之前为每个“关键”代码创建一个对象。下面是一个实际的使用案例:如果你编写一个更新工具,如getdown()并替换你自己的jar(忽略这可能有点脆弱),我们尝试的类装入器无法装入新类(因为文件句柄可能无效)。如果我们在更新程序结束前预加载所有需要的类,我们就可以了。下面是另一个实际使用案例:如果您想验证类是否可以在构建时(而不是运行时)加载(=未中断),请在@mcfinnigan处记录类加载程序错误的解决方法。“类加载器将在需要时立即加载.class文件”。感谢您提供的信息。另一个很好的例子是,回答文字问题不是一个好主意(+1)回答问题会更有帮助。例如,在启动时加载大量用户创建的插件时,这是一种非常有效的方法。这是一种解决问题的方法”类加载器将在需要时立即加载.class文件”。感谢您提供的信息。另一个很好的例子是,回答文字问题不是一个好主意(+1)回答这个问题会更有帮助。例如,在启动时加载大量用户创建的插件时,这是一个非常有效的方法。这是一个如何忽略嵌套类的解决方法如何忽略嵌套类