我不认为有可能做你想做的。如果你有三个类都称为“src.tool.Tools”,Java不关心你从哪个jar文件中加载它们。如果所有三个项目(我假设意味着jar文件)都具有相同的类,则Java将发生冲突,并且无法预测它将加载哪个工具。
确保正确的调用的唯一方法是确保其他两个不在类路径中。
存在针对您的问题的黑客解决方案。您可以为每个项目创建一个新的ClassLoader,并向ClassLoader提供Tools类所需的项目。然后使用反射,您可以实例化它并调用该方法。由于每个项目都在自己的ClassLoader中,因此三个Tools类不会再发生冲突。
例:
URLClassLoader a = new URLClassLoader(aJar.toURL(), getClass().getClassLoader());
Class toolsClass = Class.forName("src.tool.Tools", true, a);
Method m = toolsClass.getDeclaredMethod("tool");
Object i = toolsClass.newInstance();
Object result = m.invoke(instance);
(URLClassLoader的例子来自How should I load Jars dynamically at runtime?拉)
我不认为你可以用class来控制是否使用。这由类路径中的jar文件的顺序决定。 (提供该类的第一个jar文件将被使用。) – aioobe
您需要确保包名称是唯一的,比如'a.tool','b.tool'等等,而不是每个包名都相同项目。 –
这似乎是一个非常糟糕的设计,导致方法(不是函数)具有***完全相同的名称。你应该看看用更好的名字来重命名它们,而不是所有这些诡计。 –