重複の可能性:
Java クラスは実行時にそれ自体にメソッドを追加できますか?
Javaでクラスの実行時に新しいメソッドを合成することは可能ですか? それを可能にするライブラリはありますか?
重複の可能性:
Java クラスは実行時にそれ自体にメソッドを追加できますか?
Javaでクラスの実行時に新しいメソッドを合成することは可能ですか? それを可能にするライブラリはありますか?
バイトコード エンジニアリング ライブラリを超えて、クラスのインターフェイスがあれば、Java のProxy
クラスを使用できます。
インターフェースの場合:
public interface Foo {
void bar();
}
具体的なクラス:
class FooImpl {
public void bar() {
System.out.println("foo bar");
}
}
呼び出されたメソッドを処理するには、次を使用しますInvocationHandler
。
class FooInvocationHandler implements InvocationHandler {
private Foo foo;
FooInvocationHandler(Foo foo) {
this.foo = foo;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Exception {
if (method.getName().equals("bar"))
System.out.println("foo me");
// return null if you don't want to invoke the method below
}
return method.invoke(foo, args); // Calls the original method
}
}
次に、を使用してインスタンスをFooFactory
生成およびラップする を作成します。FooImpl
Proxy
public class FooFactory {
public static Foo createFoo(...) {
Foo foo = new FooImpl(...);
foo = Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { Foo.class },
new FooInvocationHandler(foo));
return foo;
}
}
FooImpl
これにより、次のようにオブジェクトがラップされます。
Foo foo = FooFactory.createFoo(...);
foo.bar();
版画:
foo me
foo bar
これは BCEL ライブラリの代替手段であり、実行時情報からクラスを生成するなど、これを行うことができますが、BCEL ライブラリはネイティブではありません。(1.3以降のすべてに参加しています。Proxy
)java.lang.reflect
すでにロードされているクラスに? 私の知る限りではありません。
ただし、新しいクラスの生成に関心があるかもしれません。2 つのオプションが表示されます。
そのようです:
public static void printTest() {
System.out.println("Hey!");
}
次に、バイトコードを見て、ConstantPool のどこに「Hey!」が表示されているかを確認します。次に、メソッドのバイトコードを取得してバイト配列にキャッシュし、定義済みのバイト + 定数プール (前に調べたもの) を使用してメソッドを動的に作成し、定数プールを文字列で変更します。ただし、より複雑なメソッドの場合、これは非常にトリッキーになります (注: err に変更するなど、呼び出すメソッドまたは取得するフィールドを変更するために同じことができます)。
私が見る限り、良い選択肢は本当にないので、これらはあなたの最善の策です