库重载方法是否可以在不重新编译的情况下使用?

时间:2011-05-24 09:43:15

标签: java classloader overloading

假设库中有一个方法

public static <E> void doSmth(Collection<E> foo, Collection<E> bar){...}

,它在以下代码中使用:

Set<Object> foo = ...;
List<Object> bar = ...;
doSmth(foo, bar);

现在,另一个版本的库在类路径中替代前者,它有两个方法:

public static <E> void doSmth(Collection<E> foo, Collecion<E> bar){...}
public static <E> void doSmth(Set<E> foo, List<E> bar){...}

不会重新编译并运行应用程序。将使用哪种方法?

3 个答案:

答案 0 :(得分:2)

重载解析是一个编译时进程,因此如果不重新编译,其结果将无法更改。

所以,

public static <E> void doSmth(Collection<E> foo, Collecion<E> bar){...}
将使用

,因为它的签名是在编译文件中指定的。

答案 1 :(得分:1)

如果在类路径中有相同库的2个版本,则很难分辨哪个类加载器首先加载(以及它将使用哪个版本) - 实际上机会结果会因机器和JVM而异到JVM。 如果确实需要首先加载某个版本,可以通过命令行中的-Xbootclasspath参数将其添加到 bootclasspath

答案 2 :(得分:1)

库不包含方法,类可以。并且类在第一次需要时由类加载器加载。

类(通常)以与它们在类路径中出现的顺序相同的顺序加载。 通常只是因为花哨的自定义类加载器可以实现其他策略。

那么对你的问题,并查看正常的行为:如果我们在路径上有两个同名的,一个包含两个,另一个包含方法,然后只加载一个类,这是类加载器首先找到的类。加载一个类后,不需要(相同的)类加载器再次查找具有相同名称的类。


Overloading is determined statically at compile time, so method 1 will (still) be called.