JavaダイナミックエージェントのCGLIB

6142 ワード

JavaダイナミックエージェントのCGLIB
概要
Cglibは優れた動的エージェントフレームワークであり、その下位層はASMを使用してメモリ内で被エージェントクラスのサブクラスを動的に生成する.CGLIBを使用すると、エージェントクラスによってインタフェースが実装されていなくても動的エージェント機能を実現することができる.CGLIBは簡単で使いやすく、JDKのProxyダイナミックエージェントよりもはるかに高速に動作します.
CGLIBのコアクラス:
net.sf.cglib.proxy.Enhancer–主な強化クラス
net.sf.cglib.proxy.MethodInterceptor–Callbackインタフェースのサブインタフェースであり、ユーザーが実装する必要があるクラスをブロックする主な方法
net.sf.cglib.proxy.MethodProxy–JDKのjava.lang.reflect.Methodクラスのエージェントクラスは、次のようなソース・オブジェクト・メソッドの呼び出しを容易に行うことができます.
Object o = methodProxy.invokeSuper(proxy, args);//最初のパラメータは被エージェントオブジェクトですが、デッドループの問題は発生しません.
インスタンスの使用
プロキシ対象クラス:
package cglib;
/*
 *       
 */
public class Target {
	public void say(String string) {
		
		System.out.println("Target.say()");
		System.out.println(string);
	}
	
	

}

エージェントクラスの実装:
package cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class ProxyTest implements MethodInterceptor {

	@Override
	/*
	 * (non-Javadoc)
	 * @see net.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], net.sf.cglib.proxy.MethodProxy)
	 * 
	 *                  ;
	                     Method  ;
 	                           ;
	              MethodProxy    ,    cglib      Method       ,  MethodProxy   JDK   Method             
	 */
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
		System.out.println("bofore");
		/*
		 * invokeSuper()  ,                 ,  invokeSuper            。
		 */
		Object object = arg3.invokeSuper(arg0, arg2);
		System.out.println("after");
		
		return "hahah";
	}
	
	
	
	

}

テストクラス:
package cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class ProxyTest implements MethodInterceptor {

	@Override
	/*
	 * (non-Javadoc)
	 * @see net.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], net.sf.cglib.proxy.MethodProxy)
	 * 
	 *                  ;
	                     Method  ;
 	                           ;
	              MethodProxy    ,    cglib      Method       ,  MethodProxy   JDK   Method             
	 */
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
		System.out.println("bofore");
		/*
		 * invokeSuper()  ,                 ,  invokeSuper            。
		 */
		Object object = arg3.invokeSuper(arg0, arg2);
		System.out.println("after");
		
		return "hahah";
	}
	
	
	
	

}

出力:
bofore
Target.say()
aaaa
after