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回だけ書き換えることができることを説明します