Java-动态代理

1.代码

package com.che.carcheck.ui.helper;

import com.che.carcheck.support.util.LogUtil;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理模式学习
 * <p>
 * 作者:余天然 on 16/5/6 下午2:30
 */
public class ProxyStudy {

    //使用场景
    public static void main() {
        //被代理类
        UserImpl target = new UserImpl("小明");
        target.login();
        target.updateInfo();

        //静态代理
        testStaticProxy(target);

        //JDK动态代理
        testJdkProxy(target);

        //Cglib动态代理
        testCglibProxy(target);

    }

    private static void testStaticProxy(UserImpl target) {
        LogUtil.print("静态代理:开始");
        UserStaticProxy staticProxy = new UserStaticProxy(target);
        staticProxy.login();
        staticProxy.updateInfo();
    }

    private static void testJdkProxy(UserImpl target) {
        LogUtil.print("JDK动态代理:开始");
        JdkProxyFactory jdkFactory = new JdkProxyFactory();
        User jdkProxy = (User) jdkFactory.createProxy(target);
        jdkProxy.login();
        jdkProxy.updateInfo();
    }

    /**
     * 测试Cglib动态代理
     * <p>
     * 注意:此代码在Java环境可运行,但在Android环境会报错!
     * 原因:Java是JVM虚拟器,Android是DarvikVM虚拟机,类加载机制有区别,而Cglib是基于继承的字节码生成技术,所有有问题。
     *
     * @param target
     */
    private static void testCglibProxy(UserImpl target) {
        LogUtil.print("Cglib动态代理:开始");
        CglibProxyFactory cglibFactory = new CglibProxyFactory();
        User cglibProxy = (User) cglibFactory.createProxy(target);
        cglibProxy.login();
        cglibProxy.updateInfo();
    }

    //接口
    public interface User {
        void login();

        void updateInfo();
    }

    //被代理类
    public static class UserImpl implements User {
        private String name;

        public UserImpl(String name) {
            this.name = name;
        }

        @Override
        public void login() {
            LogUtil.print(this.name + "登录……");

        }

        @Override
        public void updateInfo() {
            LogUtil.print(this.name + "更新信息……");
        }

    }

    //静态代理
    public static class UserStaticProxy implements User {
        private UserImpl userImpl;

        public UserStaticProxy(UserImpl userImpl) {
            this.userImpl = userImpl;
        }

        @Override
        public void login() {
            doBefore();
            this.userImpl.login();
        }

        @Override
        public void updateInfo() {
            doBefore();
            this.userImpl.updateInfo();
            doAfter();
        }

        private void doBefore() {
            LogUtil.print("静态代理:前置动作……");
        }

        private void doAfter() {
            LogUtil.print("静态代理:后置动作……");
        }

    }

    //JDK动态代理
    public static class JdkProxyFactory implements InvocationHandler {
        private Object target;

        //创建代理类
        public Object createProxy(Object target) {
            this.target = target;
            //取得代理对象
            return Proxy.newProxyInstance(
                    target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        }

        //改变委托类方法的调用逻辑
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Object result = null;
            if (method.getName().equals("login")) {
                doBefore();
                result = method.invoke(target, args);
            }
            if (method.getName().equals("updateInfo")) {
                doBefore();
                result = method.invoke(target, args);
                doAfter();
            }
            return result;
        }

        private void doBefore() {
            LogUtil.print("JDK动态代理:前置动作……");
        }

        private void doAfter() {
            LogUtil.print("JDK动态代理:后置动作……");
        }

    }

    //Cglib动态代理
    public static class CglibProxyFactory implements MethodInterceptor {
        private Object target;

        //创建代理类
        public Object createProxy(Object target) {
            this.target = target;
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(this.target.getClass());
            enhancer.setCallback(this);
            return enhancer.create();
        }

        //改变委托类方法的调用逻辑
        @Override
        public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            Object result = null;
            if (method.getName().equals("login")) {
                doBefore();
                result = proxy.invokeSuper(target, args);
            }
            if (method.getName().equals("updateInfo")) {
                doBefore();
                result = proxy.invokeSuper(target, args);
                doAfter();
            }
            return result;
        }

        private void doBefore() {
            LogUtil.print("Cglib动态代理:前置动作……");
        }

        private void doAfter() {
            LogUtil.print("Cglib动态代理:后置动作……");
        }
    }


}

2.日志

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值