JAVA実装エージェント

2240 ワード

エージェントを使用して実行時に
特定のインタフェースのセットを実装した新しいクラスを作成します.この機能は、コンパイル時にどのインタフェースを実装する必要があるかを判断できない場合にのみ使用します.
エージェントクラスは指定されたインタフェースを実現できます
1.インタフェースに必要なすべてのメソッドを指定します.
2.Objectクラスのすべてのメソッド.
エージェントの機能の実装
1.プロセッサを呼び出す
しかし、実行時にこれらのメソッドの新しいコードを定義するのではなく、InvocationHandlerインタフェースのオブジェクトを実現する呼び出しプロセッサを提供する必要があります.このインタフェースには1つのメソッドしかありません.
Object invoke(Object proxy,Method method,Object []args)
エージェント・オブジェクトを呼び出す方法にかかわらず、呼び出しプロセッサのinvokeメソッドは呼び出され、Methodオブジェクトと元の呼び出しパラメータが渡され、呼び出しプロセッサは呼び出しを処理する方法を与えなければならない.
2.プロキシオブジェクトの作成
ProxyのnewProxyInstanceメソッドを使用する必要があります.このメソッドには3つのパラメータがあります.
1.クラスローダ
2.Classオブジェクト配列、各要素は実装が必要なインタフェース
3.呼び出しプロセッサ
例:エージェント・オブジェクトを使用して二分検索を追跡する
まず、配列を1~1000の整数のエージェントで埋め、ArraysクラスのbinarySearchメソッドを呼び出して配列内のランダムな整数を検索し、最後に一致する要素を印刷します.
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Random;

import question.tahm;


public class ProxyTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Object []elements=new Object[100];
		for(int i=0;i=0)
			System.out.println(elements[result]);
	}
	
}
class TraceHandler implements InvocationHandler
	{
		public TraceHandler(Object o)
		{
			target=o;
		}
		@Override
		public Object invoke(Object arg0, Method arg1, Object[] arg2)
				throws Throwable {
			// TODO Auto-generated method stub
			System.out.print(target);
			System.out.print("."+arg1.getName()+"(");
			if(arg2!=null)
			{
				for(int i=0;i

実行結果: 
50.compareTo(26) 25.compareTo(26) 37.compareTo(26) 31.compareTo(26) 28.compareTo(26) 26.compareTo(26) 26.toString() 26
エージェントクラスの機能:
エージェントは実行中に作成されますが、作成されると通常のクラスと変わりません.