要約: 1.私は、動的プロキシを作成する最終的なクラスをいくつか持っています。どうしたらいいですか? 2. MethodHandleをMethodに変換できますか?finalクラスの動的プロキシはどのように作成できますか?
詳細 まず、MethodHandleをメソッドに変換するAPIはありますか? java.lang.invoke.MethodHandlesのようなもの
public MethodHandle unreflect(Method m) throws IllegalAccessException;
しかし、逆の方法ですか?
私は動的なjava.lang.reflect.Methodを作成したいとしましょう。
public final
class Method extends AccessibleObject implements GenericDeclaration,
Member ;
私はJDKのダイナミックプロキシを使用したいと思うので、私はいくつかのインターフェース(例えばMember)を使わなければなりません。しかし、2つの主要なdrawabacks。それらは広く使用されつつ、第1、例えば
public Class<?>[] getParameterTypes();
など
public Class<?> getReturnType();
限り方法は、任意のインターフェイスの一部ではありません。
第2の欠点は、ドロップイン置換を提供できないことである。つまり、動的プロキシをjava.lang.reflect.Methodが必要なコードに渡すことはできません。
もう1つの方法は、CGLIBまたはJavaassistを使用することです。 AFAIK、CGLIBは最終クラスを代理することはできません、彼ですか? Javaassistプロキシファイナルクラスを使用できますか?クラスから最終的な識別子を「削除」するにはどうすればよいですか? AFAIL、Javvassistは何とかそれを行うことができます...
最後のオプションを詳しく説明できますか? – piotrek
インストルメンテーションAPIを使用してクラスを再定義することができます。たとえば、クラスはメソッドfooを定義します。メソッドバーの名前を変更し、再定義した新しいメソッドfooから呼び出すことができます –