Java 调用与具有相同包名的其他函数同名的函数

Java 调用与具有相同包名的其他函数同名的函数,java,Java,我的Java项目中有一个问题,我有一堆项目(例如a、B、C…),它们碰巧在工具文件夹中有一个工具类,路径为src.tool.Tools,所有这些项目的路径和类名都相同 现在,我有了我的项目Z,它的构建路径中包含了所有这些项目(A、B、C…)。如何确保在导入一个工具类时,我正在导入真正需要的工具类 更复杂的是,如果在A.Tool中有一个方法,如public int Tool(){return 1},在B.Tool中有另一个方法,如public int Tool(){return 0},我如何确保调

我的Java项目中有一个问题,我有一堆项目(例如a、B、C…),它们碰巧在工具文件夹中有一个工具类,路径为src.tool.Tools,所有这些项目的路径和类名都相同

现在,我有了我的项目Z,它的构建路径中包含了所有这些项目(A、B、C…)。如何确保在导入一个工具类时,我正在导入真正需要的工具类

更复杂的是,如果在A.Tool中有一个方法,如public int Tool(){return 1},在B.Tool中有另一个方法,如public int Tool(){return 0},我如何确保调用我真正想要的函数


谢谢大家

假设您的项目A、B、C都有不同的包名称空间,例如com.you.A、com.you.B等,那么您的工具类现在可以在多个位置使用,例如com.you.A.tool.Tools、com.you.B.tool.Tools等

因此,在Projectz中创建Tools类的实例时,可以在声明对象引用变量时指定要使用的确切类

private com.you.A.tool.Tools toolsFromA;
private com.you.B.tool.Tools toolsFromB;

调用
toolsfrom.tool()
将返回1,调用
toolsFromB.tool()
将返回0。

假设您的项目A、B、C都有不同的包名称空间,例如com.you.A、com.you.B等,那么您的Tools类现在将在多个位置可用,如com.you.A.tool.tool、com.you.B.tool等

因此,在Projectz中创建Tools类的实例时,可以在声明对象引用变量时指定要使用的确切类

private com.you.A.tool.Tools toolsFromA;
private com.you.B.tool.Tools toolsFromB;
调用
toolsfrom.tool()
将返回1,调用
toolsFromB.tool()
将返回0。

可能使用:

每个用户定义的类装入器都是 抽象类加载器。应用程序采用用户定义的类 加载程序,以扩展Java虚拟 机器动态加载,从而创建类。用户定义 类加载器可用于创建源于 用户定义的源。例如,一个类可以跨 动态生成或从加密文件中提取的网络

可能使用:

每个用户定义的类装入器都是 抽象类加载器。应用程序采用用户定义的类 加载程序,以扩展Java虚拟 机器动态加载,从而创建类。用户定义 类加载器可用于创建源于 用户定义的源。例如,一个类可以跨 动态生成或从加密文件中提取的网络


我认为不可能做你想做的事。如果有三个类都称为“src.tool.Tools”,那么Java并不关心从哪个jar文件加载它们。如果所有三个项目(我假设这意味着jar文件)都有相同的类,Java将发生冲突,您无法预测它将加载哪些工具

确保调用正确的一个的唯一方法是确保其他两个不在类路径中

你的问题有一个简单的解决办法。您可以为每个项目创建一个新的类加载器,并要求类加载器为Tools类提供所需的项目。然后使用反射可以实例化它并调用该方法。因为每个项目都在自己的类加载器中,所以这三个工具类将不再冲突

例:


(URLClassLoader示例取自)

我认为不可能实现您想要的功能。如果有三个类都称为“src.tool.Tools”,那么Java并不关心从哪个jar文件加载它们。如果所有三个项目(我假设这意味着jar文件)都有相同的类,Java将发生冲突,您无法预测它将加载哪些工具

确保调用正确的一个的唯一方法是确保其他两个不在类路径中

你的问题有一个简单的解决办法。您可以为每个项目创建一个新的类加载器,并要求类加载器为Tools类提供所需的项目。然后使用反射可以实例化它并调用该方法。因为每个项目都在自己的类加载器中,所以这三个工具类将不再冲突

例:

(URLClassLoader示例取自)

三个选项:

危险的方法:确保您真正想要的类在类路径中排在第一位,并且每个涉及的类加载器都按照这个顺序处理它们。这可能会非常容易地破坏,结果非常混乱。您不能访问该类的多个版本,您只能控制所访问的版本。不要这样做

复杂的方法:为您所依赖的每个项目创建类加载器,并处理特定的类加载器以加载类。这需要做大量的工作,您也许可以使用OSGI来实现这一点。只有当您的主要目的是了解类装入器时,才可以这样做

简单而正确的方法:重构项目,使每个项目中的所有包在包名称中都有项目名称(或项目的某些表示形式)。这使得每个包名都是唯一的,您可以毫无问题地访问类(如果您必须在一个位置使用多个工具类,则可能使用完整的限定类名),同时,您还可以重命名实际描述用途、类和包名的工具类,如“Util”、“Tool”或“Misc”都是非常糟糕的代码气味

三个选项:

危险的方法:确保您真正想要的类在类路径中排在第一位,并且每个涉及的类加载器都按照这个顺序处理它们。这可能会非常容易地破坏,结果非常混乱。您不能访问该类的多个版本,您只能控制所访问的版本。不要这样做

复杂的