2011-09-27 107 views
0

this question,它可以从一个jar文件中加载类:如何在运行时加载所有类的jar文件?

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

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

+2

你为什么要这样做? – mcfinnigan

+0

不成熟的优化?无法容忍代码的关键部分的延迟?无论如何,在这种情况下,最好在关键部分之前制作每个“关键”部分的对象。 –

+0

下面是一个实际的用例:如果你编写一个像getdown(http://code.google.com/p/getdown/)这样的更新工具,并且替换你自己的jar(忽略这可能有点脆弱),那么这个类我们尝试的加载器无法加载新类(因为文件句柄可能无效)。如果我们预先加载所有需要更新的结束的类,那么我们很好。 – mringwal

回答

3

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

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

+0

“类加载器将在需要时立即加载.class文件”。谢谢(你的)信息。 – julien

+3

回答字面问题的另一个好例子不是一个好主意(+1) –

+4

回答这个问题会更有帮助。这是一个非常有效的方法,例如,在启动时加载大量用户创建的插件。 – Nim

0

你将不得不打开它作为zip文件,通过名称,假设所有以.class结尾的条目都是类文件并加载它们,忽略嵌套的类等。

但是......为什么?

0

如果你真的想要动态地读取类,留给专业人士,谁已经实现了。实现你自己的类加载器很困难。相信我。我已经尝试了几次。改为使用类似OSGi的东西,它为您提供动态类加载等等。