2017-08-21 44 views
0

我正在使用javassist庫來修改類文件。如何通過使用javassist將接口轉換爲抽象

我想修改界面,抽象類

例如, 原:

public interface javax.servlet.Servlet { 
public void init(ServletConfig config) throws ServletException; 
} 

修改:

public abstract javax.servlet.Servlet { 
    public void init(ServletConfig config) throws ServletException { 
     System.out.println(config.getServletContext().getServerInfo()); 
     callMethod(); // this is implemented original method 
    } 
} 

如何申請這一解決方案像AOP(前,後)?

回答

1

我覺得你的方法的第一個問題是,當你嘗試修改interface使用Javassist您試圖重新定義了類加載器是已經裝載的接口。

一個選項可能是做了一下類加載器的技巧:創建一個新的classloader不具備現有的接口加載(父是系統類加載器),並有Javassist負載通過(使用aCtClass.toClass()方法,該方法一個參數ClassLoader)。然而,我不會做這件事,因爲要正確管理多個ClassLoader並不那麼容易。

可能有更好的方法來實現你的目標,創建新的類可能是一個更好的設計。您可以創建一個新類,實現您需要的所有內容,然後擴展所需的接口。

此外,我建議你到也看看dynamic proxies這可能是一個選項。他們最大的優勢是你不需要任何第三方庫來創建它們。

+0

thx for kind reply:) 我想通過使用javassist爲所有類應用動態代理實現javax.servlet.Servlet 。 這將是一個好主意,以實現:D – zackim

+0

不客氣:) – rakwaht

+0

考慮upvote /設置爲正確的這個答案爲未來的用戶需要 – rakwaht