美文网首页
Java代理(jdk静态代理、动态代理和cglib动态代理)

Java代理(jdk静态代理、动态代理和cglib动态代理)

作者: shuangyueliao | 来源:发表于2019-11-07 23:02 被阅读0次

    jdk静态代理

    public interface AddService {
        Integer add(int a, int b);
    }
    
    public class AddServiceImpl implements AddService {
        @Override
        public Integer add(int a, int b) {
            return a + b;
        }
    }
    
    public class AddServiceProxy implements AddService{
        private AddService addService;
    
        public AddServiceProxy(AddService addService) {
            this.addService = addService;
        }
    
        public static void main(String[] args) {
            AddService addService = new AddServiceImpl();
            AddService addServiceProxy = new AddServiceProxy(addService);
            addServiceProxy.add(1, 3);
        }
    
        @Override
        public Integer add(int a, int b) {
            System.out.println("before");
            int result =  addService.add(a, b);
            System.out.println("result: " + result);
            System.out.println("after");
            return result;
        }
    }
    

    jdk动态代理

    jdk动态代理的业务类必须实现接口

    public interface AddService {
        Integer add(int a, int b);
    }
    

    业务类的实现类

    public class AddServiceImpl implements AddService {
        @Override
        public Integer add(int a, int b) {
            return a + b;
        }
    }
    

    代理类的生成

    public class AddServiceHandler implements InvocationHandler {
        private AddService addService;
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before");
            Object invoke = method.invoke(addService, args);
            System.out.println(invoke);
            System.out.println("after");
            return invoke;
        }
    
        public AddServiceHandler(AddService addService) {
            this.addService = addService;
        }
    
        public AddService getProxy() {
            return (AddService) Proxy.newProxyInstance(addService.getClass().getClassLoader(), addService.getClass().getInterfaces(), this);
        }
    
        public static void main(String[] args) {
            AddService service = new AddServiceImpl();
            AddServiceHandler addServiceHandler = new AddServiceHandler(service);
            AddService proxy = addServiceHandler.getProxy();
            proxy.add(1, 2);
        }
    }
    

    cglib动态代理

    业务类不需要实现接口,但不能业务类需要继承,所以业务类不能是final及业务类的相应方法不能是final

    public class AddServiceImpl {
        public Integer add(int a, int b) {
            return a + b;
        }
    }
    
    public class AddServiceCglib implements MethodInterceptor {
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("before");
            Object result = methodProxy.invokeSuper(o, objects);
            System.out.println("result:" + result);
            System.out.println("after");
            return result;
        }
    
        public Object getInstance(Class clzz) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(clzz);
            enhancer.setCallback(this);
            return enhancer.create();
        }
    
        public static void main(String[] args) {
            AddServiceCglib cglib = new AddServiceCglib();
            AddServiceImpl addServiceImpl = (AddServiceImpl) cglib.getInstance(AddServiceImpl.class);
            addServiceImpl.add(1,7);
        }
    }
    

    相关文章

      网友评论

          本文标题:Java代理(jdk静态代理、动态代理和cglib动态代理)

          本文链接:https://www.haomeiwen.com/subject/zlmbbctx.html