在运行时在Java中查找具有相同完整限定名的类

在运行时在Java中查找具有相同完整限定名的类,java,reflection,jar,classpath,Java,Reflection,Jar,Classpath,假设我有一个jara.jar和一个classcom.company.ma.MyClass package com.company.ma 公共类MyClass{ 公共方法(){ System.out.println(“嘿”); } } 还有另一个jarb.jar,它有一个类com.company.ma.MyClass,但实现不同 package com.company.ma 公共类MyClass{ 公共无效无热法(){ System.out.println(“这是不同的”); } } 这些类具

假设我有一个jar
a.jar
和一个class
com.company.ma.MyClass

package com.company.ma
公共类MyClass{
公共方法(){
System.out.println(“嘿”);
}
}
还有另一个jar
b.jar
,它有一个类
com.company.ma.MyClass
,但实现不同

package com.company.ma
公共类MyClass{
公共无效无热法(){
System.out.println(“这是不同的”);
}
}
这些类具有相同的完全限定名,但它们不同

如何在类路径中找到具有给定完整限定名的所有类,例如
com.company.ma.MyClass
,并打印其位置?在这个例子中,我希望在两个不同的jar中有两个名为
com.company.ma.MyClass
的类,我认为每个(完全限定的)类名只能引用JRE中的一个类;例如,见。因此,您不能同时通过反射访问它们

也许您可以编写自己的
ClassLoader
,以捕获冲突并以您需要的任何方式处理冲突


您还可以使用打开任何.jar文件并解析其清单,其中包含.jar中包含的所有.class文件的列表。

您不能为此使用反射,因为您只能对加载的类进行提取,并且具有指定名称的类加载器只能加载一个类

您必须创建单独的类装入器(如),并使第一个类装入器解析第一个jar,第二个类装入器应该查看第二个jar。您可以使用ClassLoader.loadClass()从JAR加载类。更多信息和信息。最好不要在类路径中同时包含这两个版本,因为第二个链接表明,如果系统类加载器可以自己加载类,则可能无法工作

另一种选择是加载一个类,做任何你想做的事情,卸载它,然后加载你的另一个类。您可以通过以下方式卸载类:

  • 如前所述,删除对类及其加载程序的所有引用,并触发垃圾回收
  • 使用操纵工具可以操纵JVM的行为
  • 这样就不可能同时使用这些类,但是如果您只想比较或查找它们,这就足够了

    如果您只想定位类而不使用它们,那么可以手动解析jar文件并计算相应的.class文件,如前所述


    简短摘要:如果类路径上有两个类,则只能加载其中一个。如果在类路径上没有任何一个,则可以通过一些手动工作来加载它们。如果您只想找到它们,请解析jar文件。

    FWIW,检查您是否能够在运行时使用诸如替换加载的类之类的工具,这对您来说已经足够了。
    ClassLoader.getResources(“com/company/ma/MyClass.class”)