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