2013-10-07 24 views
5

このプロジェクトでは、実行時にクラスを拡張しようとしています。 私が知りたいことは、これも可能ですか?もしそうなら、どうすればいいのですか?これらの事のためにライブラリがありますか?実行時にクラスを拡張する

+0

なぜあなたはそれをしたいですか?ユースケースを明確にしてください。私はそれが可能かどうか疑問に思う。 –

答えて

4

CGLibは、あなたが探しているライブラリです。実行時にクラスを拡張したりインタフェースを実装するのは非常に強力なので、SpringやHibernateのような多くの一般的なフレームワークがこれを使用しています。あなたはおそらく、所望の論理で有用な方法インターセプターとNoOpコールバックを交換するだろうが

あなたは

public Object createProxy(Class targetClass) { 
    Enhancer enhancer = new Enhancer(); 
    enhancer.setSuperclass(targetClass); 
    enhancer.setCallback(NoOp.INSTANCE); 
    return enhancer.create(); 
    } 

のようなコードを使用して、クラスの拡張機能を作成することができます。

+0

素晴らしいです、ありがとう! – PaulBGD

1

はい、実行時にクラスを拡張することは可能です。実行時にバイトコードを変更することができるライブラリを試してください。 javassistまたはASM

0

答えは、「クラスを拡張する」という意味によります。 Javaの「extend」は、最初のクラスを拡張する別のクラスを宣言することを意味します(サブクラスです)。したがって、指定されたクラスのサブクラスを作成したい場合は、これが可能です。サブクラスを表すバイト配列を準備し、クラスローダに渡します。

既存のクラスにフィールドまたはメソッドを追加する場合、これはこのクラスがロードされているときにのみ可能で、バイト配列表現を置き換えることによって実行されます。クラスが既にロードされている場合は、それを変更することはできません。

+0

私は、どのクラスを拡張するかを動的に選択することを考えていました(クラスへのクラスパスが絶えず変わるので)。 – PaulBGD

関連する問題