Cglibテスト
1815 ワード
public class TestCglib {
public static void main(String[] args) {
TestCglib tc = new TestCglib();
tc.getCglib1().doOperate();
//
tc.getCglib2(tc.getCglib1()).doOperate();
}
public void doOperate(){
System.out.println("I want to do someThing");
}
public TestCglib getCglib1(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TestCglib.class);
enhancer.setCallback(new MethodInterceptor1());
return (TestCglib)enhancer.create();
}
public TestCglib getCglib2( TestCglib obj){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(new MethodInterceptor1());
return (TestCglib)enhancer.create();
}
}
class MethodInterceptor1 implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method med, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Method Interceptor 1");
return proxy.invokeSuper(obj, args);
}
}
class MethodInterceptor2 implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method med, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Method Interceptor 2");
return proxy.invokeSuper(obj, args);
}
}
Mainメソッドでは
tc.getCglib1().doOperate();
正常に実行可能
ただし、次のコードであれば例外が放出されます.
tc.getCglib2(tc.getCglib1()).doOperate();
同じクラスをcglibで1回だけ書き換えることができることを説明します