java类加载器

时间:2011-08-01 05:34:40

标签: java classloader

具有相同包结构的相同类名存在于不同的jar文件中,并且这两个类由不同的类加载器加载。如果我想导入这两个类并在不同的场景中使用它们,那我该怎么做呢?请让我知道技术。

Eample :
ClassLoader :-TestClassLoaderFirst
package src.test.com;
class TestClass is present in A.jar 
TestClass{
   public void dispaly(){
      System.out.println("In A.jar ")
   }
}


and b.jar.
ClassLoader :-TestClassLoaderSecond
package src.test.com;
Class TestClass{
   public void present(){
      System.out.println("")
}

2 个答案:

答案 0 :(得分:1)

如果你想以同一类的强类型方式使用这两个类,那么我相信你运气不好。

如果每个类仅在一个其他类中单独使用,那么您可以单独编译其他每个类,引用相应的jar文件,然后创建一个ClassLoader层次结构,以便在执行时每个类最终加载合适的班级。

然而,这是一个彻头彻尾的痛苦。如果可能,则应重命名其中一个类以避免命名冲突。即使这意味着重建一个开源项目,我也很想做到这一点。 (从最容易重建的项目中更改类的名称,以便将来节省时间。)

答案 1 :(得分:0)

正如Jon Skeet所说,(你真的应该听一个拥有327k的男人!),不要这样做。但如果你必须......
假设你的课程看起来像

public class TestClass {
    public static void display() {
        System.out.println("In A.jar ");
    }
}

并编译成target / A.jar,类似于B.jar中的TestClass,您可以在自己的包中创建一个主类,如下所示:

public class Main {

    public static void main(String[] args) throws MalformedURLException, IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException {
        URL urlA = new URL("file:target/A.jar");
        URL urlB = new URL("file:target/B.jar");
        URLClassLoader clA = new URLClassLoader(new URL[] { urlA });
        URLClassLoader clB = new URLClassLoader(new URL[] { urlB });

        clA.loadClass("TestClass").getMethod("display", (Class<?>[]) null).invoke(null, (Object[]) null);
        clB.loadClass("TestClass").getMethod("display", (Class<?>[]) null).invoke(null, (Object[]) null);
    }
}

你会得到

在A.jar中 在B.jar