我有兩個不同的罐類Client.java jar1 & jar2 現在在運行時我要決定哪些Client.class加載像如何從不同的罐子
if (country==india){
// load Client class of jar1
) else{
load client class from jar2
}
我可以做加載同一個類那...
我有兩個不同的罐類Client.java jar1 & jar2 現在在運行時我要決定哪些Client.class加載像如何從不同的罐子
if (country==india){
// load Client class of jar1
) else{
load client class from jar2
}
我可以做加載同一個類那...
您將不得不使用路徑的「完整」名稱。例如:
if (country==india){
name.first.package.Client client = new name.first.package.Client();
} else{
name.second.package.Client client = new name.second.package.Client();
}
無論如何......我會盡量避免做那樣的事......這會讓你的代碼難以閱讀和保存。
如果你真的有兩個副本的一類,具有完全相同的完全合格的名稱,在兩瓶,然後...
如果你想要安全,你不應該把他們的要麼在你的默認類加載器的類路徑中。您將需要創建兩個額外的類加載器,並將其中一個罐放入其中。您將需要獲得這兩個類的類,並且您將需要使用反射來創建您想要的實例。
我不確定爲什麼這個答案是downvoted。好吧,我想是準確的,但將努力把類的一個版本中默認的類加載器,但對方必須是在其自己的類加載器。 – 2010-05-18 04:39:30
我不知道。沒有評論,所以有人不喜歡它,但我們不知道爲什麼。 – bmargulies 2010-05-18 11:17:08
如果2個類具有相同的包名稱,即com.mycompany.Client ,那麼你最終會遇到哪種版本的客戶端加載時有點任意的情況。它首先歸結於classpath。這是一個JAR地獄情況http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell。
這是一個很好的情況,但如果你絕對必須擁有不同版本的同一個班級,有辦法做到這一點。一種方法是使用自定義類加載器,類加載器將知道您需要執行哪個版本。這不是一件微不足道的事情,可能難以管理。 OSGi框架是一種替代,以幫助管理這個(它使用定製類裝入器引擎蓋下),但我不會用,如果你只是有一個類的一個實例,因爲它是另一種框架,需要時間和維護。底線:如果可以的話,避免這種情況,如果不能,則採取阻力最小的路徑。
如果這些類有不同的包名稱,@Casidiablo提供了一個很好的答案。
我覺得你有2種方式:
1)定義一個接口的客戶端,並實現diferent類,例如:IndiaClient和Country2Client;然後
interface Client {...} class IndiaClient implements Client {...} class Country2Client implements Client {...} Client client; if (country==india){ client = new IndiaClient(); ) else{ client = new Country2Client(); }
2)讓你的方式,在2個不同的jar文件相同的類名,但你仍然需要一個接口或超類,並使用不同的類加載器來加載您的客戶端類:
interface IClient {...} class Client implements IClient {...} // in jar1 class Client implements IClient {...} // in jar2 Class<IClient> clientClass; if (country==india){ clientClass = classLoader1.loadClass("package.Client"); ) else{ clientClass = classLoader2.loadClass("package.Client"); } IClient client = clientClass.newInstance();
始終假定它們都在不同的包中。 – bmargulies 2010-05-18 01:52:35