2011-12-14 31 views
1

java classloader是否可以不止一次加载一个类,即加载类的新版本,而不会抛出“重复类定义”的LinkageError?java classloader是否可以多次加载一个类

换句话说,如果我们需要动态地重新加载一个类,可以用同一个类加载器来完成,还是必须首先销毁类加载器,然后创建一个新类来加载新版本的类?

+0

也许你需要[OSGI](http://en.wikipedia.org/wiki/OSGi) – stivlo 2011-12-14 11:33:53

+1

这个问题的接受答案是相当有帮助的:http://stackoverflow.com/questions/148681/unloading-classes -in-java – laher 2011-12-14 11:35:34

回答

3

一个类加载器只能实际加载一次类!这意味着它只能定义一次。它可以加载多次,但只是第一次定义它。剩下的时间将加载它已经从第一次定义的现有实例。

试图定义一个类两次导致LinkageError“重复的类定义”。如果需要多次加载和重新加载类,那么这必须由不同的类加载器完成,如下所示:

创建一个自己的类加载器,用于加载类。当你想重新加载任何类时,你必须销毁你的类加载器,然后创建一个新的实例来加载你的类的新版本。

当然,这会导致额外的负载,但是如果您需要它,那也没关系。

另外,请注意在销毁类加载器的旧实例时不要留下任何类的引用,因为这会导致内存泄漏!

0

重新加载类的原因是类中的变化。在这个空间热点自动关心班的重装。所以你不必关心这个。我希望这有帮助。

+1

问题是否可以通过同一个类加载器完成重新加载! – 2011-12-14 11:44:03

相关问题