Javaエージェントシリーズ-ダイナミックエージェントウォーミングアップ


前章ではJavaの静的エージェントについて学びましたが、主に動的エージェントを使用しています.動的エージェントを学ぶ前に、必要なAPIを熟知しておきましょう.
InvocationHandler
Proxy
Method
InvocationHandlerは、Javaダイナミックエージェントを使用して実装する必要があるインタフェースです.invokeには1つの方法しかありません.
Java反射を使用したことがあるかもしれない友人たちは、この方法を見たことがあります.これは最終的な方法を呼び出すために使用されます.
Java JDKドキュメントの詳細な説明を以下に示します.
invoke
Object invoke(Object proxy, Method method, Object[] args)
              throws Throwable
メソッド呼び出しをプロキシインスタンスで処理し、結果を返します.メソッドに関連付けられたプロキシインスタンスでメソッドが呼び出されると、呼び出しハンドラでメソッドが呼び出されます.
パラメータ:
Proxy-メソッドを呼び出すプロキシインスタンス
method-エージェントインスタンスで呼び出されたインタフェースメソッドのMethodインスタンスに対応します.Methodオブジェクトの宣言クラスは、メソッドを宣言するインタフェースであり、プロキシクラスがメソッドを継承するプロキシインタフェースに依存するスーパーインタフェースであってもよい.
args-入力エージェントインスタンス上のメソッド呼び出しのパラメータ値を含むオブジェクト配列.インタフェースメソッドがパラメータを使用しない場合nullです.基本タイプのパラメータは、java.lang.Integerまたはjava.lang.Booleanなどの適切な基本パッケージクラスのインスタンスにパッケージされます.
戻り値:
プロキシインスタンスのメソッドから返された値を呼び出します.インタフェースメソッドの宣言戻りタイプが基本タイプである場合、このメソッドが返す値は、対応する基本パッケージオブジェクトクラスのインスタンスに違いありません.それ以外の場合は、宣言された戻りタイプに割り当てることができるタイプに違いありません.このメソッドがnull値を返し、インタフェースメソッドの戻りタイプが基本タイプである場合、プロキシインスタンス上のメソッド呼び出しはNull PointerExceptionを放出します.それ以外の場合、このメソッドで返される値が上記のインタフェースメソッドの宣言された戻りタイプと互換性がない場合、プロキシインスタンス上のメソッド呼び出しはClassCastExceptionを放出します.
放出:
Throwable-エージェントインスタンス上のメソッドから放出された例外を呼び出します.この例外のタイプは、インタフェースメソッドのthrows句で宣言するいずれかの異常タイプまたは検査されていない異常タイプjavaに割り当てる必要がある.lang.RuntimeExceptionまたはjava.lang.Error.このメソッドがチェックされた例外を放出する場合、この例外はインタフェースメソッドのthrows句で宣言されたいずれかの例外タイプに割り当てられません.エージェントインスタンスのメソッド呼び出しは、このメソッドが放出した例外を含むUndeclaredThrowbleExceptionを放出します.
関連項目:
UndeclaredThrowableException
Proxy:メソッドを呼び出すインタフェース実装クラスのインスタンス.たとえば、前章のnew HelloInterfaceImpl()はインスタンスオブジェクトです.
method:呼び出すメソッド名は、HelloInterfaceImplにあるメソッドでなければなりません.例えばsay、eatを書く必要があります.それは間違いに違いありません.
Args[]:呼び出されたメソッドのパラメータ配列
methodもargs[]パラメータも自分で拡張したくないので、デフォルトでいいです.
しかしproxyは自分でインプリメンテーションを注入する必要があり,実際にはそのエージェントオブジェクトのインスタンスを得ることである.
実際に呼び出すと、たとえば
//     ,   mothod.invoke(proxy, args)
@Override
public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        method.invoke(proxy, args);  
    }

最後のメソッド呼び出しに使用されるMethodエージェントクラスも使用されます.次はMethodインタフェースのinvokeメソッドAPIです.
 Object invoke(Object obj, Object... args) 
                           Method          。

上から分かるように、objのインスタンスを得るだけで、オブジェクトが返されます.
メソッド呼び出しの方法については書き終わりますが、proxyのインスタンスを得る方法を見てみましょう.Proxyインタフェースを使用します.公式APIを見てどのように説明しますか.
Proxy                    ,                     。

つまり、proxyインスタンスを生成する静的メソッドを提供します.次はこの方法の公式APIインタフェースの説明です.
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
                        ,                      。

loader:バインドする特定のインプリメンテーションクラスをロードするclass
interface:上のclass実装インタフェース
h:上のInvocationHandler自体のオブジェクトは、InvocationHandlerクラスを実装して自分のオブジェクトを得るため、thisを使えばいいし、テストクラスにnewProxyInstanceメソッドを書くなど、実装クラスをInvocationHandlerオブジェクトに変換して転送する方法もあります.この方法は,クラスimplementsを実装するインタフェースを返す.
これらを理解したら、次の章ではJavaダイナミックエージェントを書きます.
才が浅いので、間違いがあれば指摘してください.ありがとうございます.