5

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

4

3 に答える 3

4

CGLibはあなたが探しているライブラリです。クラスを拡張したり、実行時にインターフェースを実装したりするのに非常に強力であるため、Spring や Hibernate などの多くの一般的なフレームワークで使用されています。

次のようなコードでクラス拡張を作成できます

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

NoOpただし、コールバックを、目的のロジックを備えた便利なメソッド インターセプターに置き換える可能性があります。

于 2013-10-07T20:22:32.703 に答える
1

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

于 2013-10-07T20:23:04.940 に答える
0

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

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

于 2013-10-08T08:33:03.110 に答える