从Java中的build bath加载方法和类

从Java中的build bath加载方法和类,java,reflection,properties,config,Java,Reflection,Properties,Config,我正在使用Eclipse,我的项目中包含了两个库:foo.jar和bar.jar。在这两个JAR中都有一个类FooBar.java,其中包括方法getFoobar(对象xy) 现在,我想根据属性文件从foo.jar或bar.jar加载方法getFoobar(对象xy): config.properties: 选择=foo 如果choice==foo,则应选择foo.jar的方法,否则使用Bar.java中的getFoobar(objectxy)方法。为了使事情更加复杂,方法getFoobar(o

我正在使用Eclipse,我的项目中包含了两个库:foo.jar和bar.jar。在这两个JAR中都有一个类FooBar.java,其中包括方法getFoobar(对象xy)

现在,我想根据属性文件从foo.jar或bar.jar加载方法getFoobar(对象xy):

config.properties: 选择=foo

如果choice==foo,则应选择foo.jar的方法,否则使用Bar.java中的getFoobar(objectxy)方法。为了使事情更加复杂,方法getFoobar(objectxy)在其方法声明中包含了从另一个JAR加载的对象,该JAR包含在foo.JAR(分别是bar.JAR)中

所以我的问题是。如何通过反射分别获得罐子的方法?我还没有找到解决办法。有没有办法解决这个问题

多谢各位


Emrah

您只能加载一个或其他方法,而不会使类装入器变得复杂。一个简单的解决方法是重命名一个或两个库的包,这样可以使foo.jar中的所有内容都从
foo.
开始,而所有内容都是bar.jar,都从
bar.
开始,从而避免任何混淆。我曾经看到,它能够基于配置加载多个版本的Xerces(并在同一个应用程序中同时使用它们)

编写读取属性的类加载器。或者,您可以在jvm参数中使用-D选项

-Dchoice=foo 
在从foo.jar或bar.jar加载类的代码中,可以切换此属性值:

String choice = System.getProperty("choice");
if (Main.CHOICE_FOO.equalsIgnoreCase(choice)) {...}
...

OSGI可以为您提供类似的功能

如何通过反射分别获得罐子的方法

你不能

反射不允许您在类的两个版本之间进行选择。事实上,就JVM而言,只有一个版本;i、 e.类路径上最早出现的一个

您可以通过定义多个类加载器来解决这个问题,每个类加载器具有不同的类路径。但是,也有一些复杂情况:

  • 如果您设法将该类的两个版本加载到正在运行的应用程序中,您将发现各个类的实例具有不同的类型,您将无法说服JVM采用其他方式

  • 当应用程序加载另一个静态依赖于其中一个类的类时,它将绑定到依赖类类加载器类路径上的类的版本。你不能改变这一点。因此,在依赖类的声明/typecasts/etc中使用类名将引用依赖类类装入器找到的类的版本,而不是另一个版本


结果是,您不能像使用常规类那样使用这些相同的命名类。。。特别是当两个版本都需要加载到同一个JVM中时。最好给两个版本的类起不同的名字。通过使类名相同,您不会得到任何好处。

为什么要通过引用来尝试它。尝试使用InstanceOf操作符检查对象,或者使用工厂模式并调用适当的方法。我认为这将是一个非常重要的问题@Damodar:InstanceOf操作符没有任何意义,因为类Foobar.java的加载存在复杂性。正如彼得所说,一个人只能从一个图书馆加载它。这就是为什么我要问。。