在运行时在Java中查找具有相同完整限定名的类
假设我有一个jar在运行时在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(“这是不同的”); } } 这些类具
a.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(“这是不同的”);
}
}
这些类具有相同的完全限定名,但它们不同
如何在类路径中找到具有给定完整限定名的所有类,例如com.company.ma.MyClass
,并打印其位置?在这个例子中,我希望在两个不同的jar中有两个名为com.company.ma.MyClass
的类,我认为每个(完全限定的)类名只能引用JRE中的一个类;例如,见。因此,您不能同时通过反射访问它们
也许您可以编写自己的ClassLoader
,以捕获冲突并以您需要的任何方式处理冲突
您还可以使用打开任何.jar文件并解析其清单,其中包含.jar中包含的所有.class文件的列表。您不能为此使用反射,因为您只能对加载的类进行提取,并且具有指定名称的类加载器只能加载一个类 您必须创建单独的类装入器(如),并使第一个类装入器解析第一个jar,第二个类装入器应该查看第二个jar。您可以使用ClassLoader.loadClass()从JAR加载类。更多信息和信息。最好不要在类路径中同时包含这两个版本,因为第二个链接表明,如果系统类加载器可以自己加载类,则可能无法工作 另一种选择是加载一个类,做任何你想做的事情,卸载它,然后加载你的另一个类。您可以通过以下方式卸载类:
简短摘要:如果类路径上有两个类,则只能加载其中一个。如果在类路径上没有任何一个,则可以通过一些手动工作来加载它们。如果您只想找到它们,请解析jar文件。FWIW,检查您是否能够在运行时使用诸如替换加载的类之类的工具,这对您来说已经足够了。
ClassLoader.getResources(“com/company/ma/MyClass.class”)