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


現在のJava開発パッケージにはダイナミックエージェントのサポートが含まれていますが、その実装はインタフェースの実装のみをサポートします.すなわち、クラスを動的にエージェントしたい場合は、まずインタフェースを継承しなければなりません.そうしないと、そのクラスをエージェントできません.
    CGLIBは、インタフェースを実装する必要がなく、通常のjavaクラスをエージェントすることができます.CBLIBの実装は非常に下位のバイトコード技術を採用し、1つのクラスのためにサブクラスを動的に生成し、サブクラスの中でその親クラスのすべての非finalをカバーする方法を採用し、それをブロックし、動的エージェントの効果を実現することは、JDK動的エージェントに対する良い補充である.
    小さな例を書きますが、HelloWorldクラスはビジネスメソッドクラス(インタフェースは実装されていません)であり、その中には戻り値と戻り値のない2つのメソッドが含まれています.CglibProxyはダイナミックエージェントクラスであり、このクラスではHelloWorldクラスメソッドのブロックを実現することができ、権限チェック、ログの記録などの横断的な問題をここで処理することができます.
 
ビジネス実装クラス:
package com.why.cglib.proxy;

/**
 *      
 * @author why
 *
 */
public class HelloWorld{

	public void sayHello() {
		System.out.println("    sayHello()");

	}

	public String sayHelloWithReturnValue() {
		String str = "HelloWorld!";
		System.out.println("    sayHelloWithReturnValue()");
		return str;
	}
}

 
動的エージェントクラス:
package com.why.cglib.proxy;

import java.lang.reflect.Method;

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

/**
 *      
 * @author why
 *
 */
public class CglibProxy implements MethodInterceptor{

	private Object targetObject;//        
	
	public Object newProxy(Object targetObject) {
		this.targetObject = targetObject ;
		Enhancer enhancer = new Enhancer();//          
		enhancer.setSuperclass(this.targetObject.getClass());//    
		enhancer.setCallback(this);//         
		return enhancer.create();//               
	}
	
	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		Object result = null;;
		
		doBefore();
		try{
			result = methodProxy.invokeSuper(proxy, args);//         			
			doAfter();
		}catch (Exception e) {
			e.printStackTrace();
			doWhenException();
		}finally{
			doFinally();
		}
		return result;
	}
	
	private void doBefore() {
		System.out.println("before method invoke!");
	}

	private void doAfter() {
		System.out.println("after method invoke!");
	}
	
	private void doWhenException() {
		System.out.println("WhenException method invoke!");
	}
	
	private void doFinally() {
		System.out.println("Finally method invoke!");
	}

}

 
 
テストクラス:
 
package com.why.cglib.proxy;

public class Test {

	/**
	 * CGLIB     
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		
		CglibProxy cglibProxy = new CglibProxy();
		HelloWorld proxy = (HelloWorld)cglibProxy.newProxy(new HelloWorld());
		
		proxy.sayHello();
		
		System.out.println("
---------------------------------
"); String str = proxy.sayHelloWithReturnValue(); System.out.println("str = " + str); } }