2012-04-18 50 views
1

上下文類加載器的我寫了從文件系統加載的jar文件的自定義類加載器。 的customClassLoader通過 覆蓋負載和find方法和工作怎樣才能讓所有後的類加載器的定義在方法執行的上下文中有customClassLoader工作的代碼。 一旦我運行的方法,該代碼f1()我得到這個錯誤java.lang.NoClassDefFoundError org.xml.dd.myclass裏面方法

我如何定義,在方法的上下文中執行所有的時間我會customClassLoader

Public void execute() 
{ 

ClassLoader customClassLoader= new customClassLoader(); 
     try 
     { 
      Class.forName("org.xml.dd.myclass", true, xdmCustomClassLoader); 
     } 
     catch (ClassNotFoundException e2) 
     { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 
     Thread.currentThread().setContextClassLoader(customClassLoader); 
     …………………. 
     F1(); 
     F2();  
} 
+0

退房這個職位http://stackoverflow.com/questions/10192453/java-classloader-change/10192896#10192896 – mazaneicha 2012-04-18 13:13:44

+0

這篇文章是講調用在宣佈後發現,這個問題的方法,我可以;使用newInstance()方法,因爲它的一個接口,我不想調用方法,我只是想確保方法f1()和f2()中的代碼使用自定義類加載器 – user1205079 2012-04-18 13:29:16

回答

2

工作的上下文ClassLoader必須明確使用。正常的new操作等將使用擁有相關代碼的類的類加載器。在下面的示例中,Executor是將用作負責自定義類加載器的所有代碼的入口點的類。使用類加載器加載該類並調用其方法run。您應該執行run,以便它執行所有需要使用您的類加載器運行的代碼。

public class Executor { 
    public void run() { 
    final MyInterface x = new MyClass(); 
    x.f1(); x.f2(); 
    } 
} 

public class Test { 
    public static void main(char[] args) throws Exception { 
    final ClassLoader customCl = new customClassLoader(); 
    final Executor e = 
     (Executor) Class.forName("Executor", true, customCl).newInstance(); 
    e.run(); 
    } 
} 
+0

我該如何使newInstance是類的接口,我得到了initatExpetion。 可以請你提供一個小例子如何用上面的代碼來做到這一點。 感謝 – user1205079 2012-04-18 14:20:19

+0

感謝您的回覆 它不工作,因爲必須的Class.forName讓我的類名org.xml.dd.my.class要不然也不會找到我的課。 ,我不想調用方法上我的課它; S運行第三方的時間相關的類,所以我只是想加載它,讓後用這個自定義類路徑工作的代碼。 爲什麼Thread.currentThread()setContextClassLoader(customClassLoader)。 不起作用。 – user1205079 2012-04-18 15:25:19

+0

我想說,你沒有明白這一點。我正在給你這個成語如何做,而不是解決你眼前的問題。你必須修改你的代碼,直到你把它變成這種形式:一個類包含一個方法,這個方法是你的類加載器中執行的所有代碼的入口點。 – 2012-04-18 16:10:25