记录一个奇怪的问题

248 阅读1分钟

现在有jdk动态代理和cglib代理的场景,发现代码执行的时候顺序不一样,特此记录下

先有个普通的service方法,有save1()和save2(),save1调用了save2

package com.itheima.demo;

/**
 * @author Smith 2020/9/12
 */
public class TestServiceImpl implements TestService {

    @Override
    public void test1() {

        System.out.println("执行test1");
        test2();
    }

    @Override
    public void test2() {
        System.out.println("执行test2");
    }
}

	public static Object getProxy(final Object target) {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                System.out.println("jdk代理开始");
                Object invoke = method.invoke(target, args);
                System.out.println("jdk代理结束");
                return invoke;
            }
        });
    }

    public static void main(String[] args) {
        TestServiceImpl testServiceImpl = new TestServiceImpl();

        TestService service;
        service = (TestService)getProxy(testServiceImpl);
        service.test1();

        System.out.println("分割线---------");

        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(TestServiceImpl.class);
        enhancer.setCallback(new MethodInterceptor(){

            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("cglib代理开始");
                Object object = methodProxy.invokeSuper(o, objects);
                System.out.println("cglib代理结束");
                return object;
            }
        });

        service = (TestService) enhancer.create();
        service.test1();
    }

代码运行结果:

jdk代理开始
执行test1
执行test2
jdk代理结束
分割线---------
cglib代理开始
执行test1
cglib代理开始
执行test2
cglib代理结束
cglib代理结束

这是为什么呢?