2011-08-01 112 views
1

具有相同包結構的相同類名存在於不同的jar文件中,並且這兩個類都由不同的類加載器加載。如果我想要導入這兩個類並在不同的場景中使用它們,那我該怎麼做?請讓我知道技術。java類加載器

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("") 
} 

回答

1

如果你想在一個強類型的方式使用這兩個類同一類那麼我相信你的運氣了。

如果每個類只能在另一個類中單獨使用,那麼可以分別編譯每個其他類,引用相應的jar文件,然後創建一個ClassLoader層次結構,以便在執行時每個類最終結束加載正確的類。

但是,這是一個完整的痛苦。如果可能全部爲,則應重命名其中一個類以避免命名衝突。即使這意味着重建一個開源項目,我也會這麼做。 (從最容易重建的項目中更改班級的名稱,以節省將來的時間。)

+0

如果使用電子ach類只能在另一個類中單獨使用,那麼可以分別編譯每個其他類,引用適當的jar文件,然後創建一個ClassLoader層次結構,以便在執行時每個類最終加載正確的類。 根據上述說明我的理解是,如果我將用於兩個不同的類,那麼它可能是可能的。你能不能請任何例子,以便我更清楚。 – Nishi

+0

@Nishi:不是,因爲它取決於你正在編寫什麼類型的應用程序,現有的類加載器是如何運行的等等。正如我所說,如果你可能*可以更好地避免碰撞。 –

0

正如Jon Skeet所說,(你真的應該聽一個327k的男人!),不要做那。但是,如果你必須...
假設你的類看起來像

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

,並編譯到目標/ a.jar文件和類似的東西發生在TestClass的B.jar,您可以創建一個主類你自己的包是這樣的:

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

+0

Pablo Grisafi @如果JAR會很大,那麼它會給性能帶來影響。你能否提供其他的選擇?如果我使用不同的clesses,那麼我如何在我的課堂中使用特定的課程。 示例:X類將使用A.jar類,而Y類將使用B.jar類。請給我舉個例子 – Nishi