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

Java 库重载方法是否会在不重新编译的情况下使用?,java,classloader,overloading,Java,Classloader,Overloading,假设图书馆里有一个方法 public static <E> void doSmth(Collection<E> foo, Collection<E> bar){...} publicstaticvoiddosmth(集合foo,集合栏){…} 并在以下代码中使用: Set<Object> foo = ...; List<Object> bar = ...; doSmth(foo, bar); Set foo=。。。; 列表栏=。。

假设图书馆里有一个方法

public static <E> void doSmth(Collection<E> foo, Collection<E> bar){...}
publicstaticvoiddosmth(集合foo,集合栏){…}
并在以下代码中使用:

Set<Object> foo = ...;
List<Object> bar = ...;
doSmth(foo, bar);
Set foo=。。。;
列表栏=。。。;
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){...}
publicstaticvoiddosmth(集合foo,集合栏){…}
公共静态void doSmth(设置foo,列表栏){…}

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

如果在类路径中有同一个库的两个版本,很难判断类加载器将首先加载哪一个版本(因此将使用哪一个)——事实上,结果很可能因机器和JVM而异。
如果确实需要先加载某个版本,可以通过命令行中的
-Xbootclasspath
参数将其添加到bootclasspath

如果类路径中有同一库的两个版本,则很难判断类加载器将首先加载哪个版本(因此将使用哪个版本)--事实上,结果很可能因机器和JVM而异。
如果确实需要先加载某个版本,可以通过命令行中的
-Xbootclasspath
参数将其添加到bootclasspath

重载解析是一个编译时过程,因此其结果在不重新编译的情况下无法更改

所以

publicstaticvoiddosmth(集合foo,集合栏){…}

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

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

所以

publicstaticvoiddosmth(集合foo,集合栏){…}

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

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

类(通常)按照它们出现在类路径上的相同顺序加载。通常只是因为奇特的自定义类加载器可以实现其他策略

对于你的问题,看看正常行为:如果路径上有两个同名的类,一个包含两个,另一个包含一个方法,那么只加载一个类,即类装入器首先找到的那个类。一旦类被加载,就不需要(相同的)类加载器再次查找具有相同名称的类



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

类(通常)按照它们出现在类路径上的相同顺序加载。通常只是因为奇特的自定义类加载器可以实现其他策略

对于你的问题,看看正常行为:如果路径上有两个同名的类,一个包含两个,另一个包含一个方法,那么只加载一个类,即类装入器首先找到的那个类。一旦类被加载,就不需要(相同的)类加载器再次查找具有相同名称的类



否,类路径中只有一个版本的库。First-在编译和首次运行期间。第二次-在第二次运行期间。那么库的第二个版本只在第二次运行之后出现?怎么做ONo,类路径中只有一个版本的库。First-在编译和首次运行期间。第二次-在第二次运行期间。那么库的第二个版本只在第二次运行之后出现?怎么做O-这是否仅适用于静态方法而不适用于实例方法?@Ivan:重载解析以相同的方式应用于静态方法和实例方法。如果您指的是本节的最后一行,则是关于通过重载解析选择签名的方法被覆盖的情况是否仅对静态方法如此,而不对实例方法如此?@Ivan:重载解析以相同的方式应用于静态方法和实例方法。如果您指的是本节的最后一行,则是关于通过重载解析选择签名的方法被覆盖的情况。对于“库的另一个版本出现在类路径中”这句话,我感到非常抱歉。我不是这个意思。@Ivan-明白了,并强化了答案;)对于“另一个版本的库出现在类路径中”这句话,我感到非常抱歉。我不是这个意思。@Ivan-明白了,并强化了答案;)
public static <E> void doSmth(Collection<E> foo, Collecion<E> bar){...}