2017-08-21 9 views
0

私はクラスファイルを変更するためにjavassistライブラリを使用しています。後、javassistを使用してインタフェースをabstractに変換する方法

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(のように、このソリューションを適用することができます方法:

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

修正:

は私が

例えば

、 元抽象クラスへのインタフェースを変更したいです)?

答えて

1

私はあなたのアプローチと最初の問題は、あなたがJavassistを使用してinterfaceを変更しようとすると、すでにクラスローダによってロードされたインタフェースを再定義しようとしているということだと思います。 (親はシステムクラスローダである)既存のインタフェースがロードされていない新しいclassloaderを作成し、それが(取るaCtClass.toClass()メソッドを使用してJavassist負荷を持っている:

一つの選択肢は、クラスローダのトリックのビットを行うことであるかもしれませんClassLoader引数)。しかし、実際に何かを正しく管理するためには何もしないでください。ClassLoaderはそれほど簡単ではありません。

あなたの目標を達成するより良い方法があるかもしれません。新しいクラスを作成する方が良いデザインかもしれません。必要なものをすべて実装し、必要なインターフェイスを拡張する新しいクラスを作成することができます。

また、私はあなたにもお勧めしますdynamic proxiesを見てみましょうにお勧めします。彼らの最大の利点は、あなたがそれらを作成するためにサードパーティライブラリを必要としないということです。

+0

返信用すべてのクラスに動的プロキシを適用するには、javacistを使用してjavax.servlet.Servlet を実装します。 これを実装することをお勧めします:D – zackim

+0

あなたは大歓迎です:) – rakwaht

+0

今後のユーザーのニーズに合わせてこの回答を修正することを検討してください – rakwaht

関連する問題