美文网首页
动态代理

动态代理

作者: i小雨 | 来源:发表于2020-11-26 18:09 被阅读0次
    • 动态代理分为两类:
      1、基于接口的动态代理; (JDK动态代理 )
      2、基于类的动态代理;(cglib动态代理)
      3、Java字节码实现。(javassist)

    JDK动态代理:

    需要了解两个类:Proxy(代理)、InvocationHandler(调用处理程序)
    接口:

    public interface UserService {
        void addUser();
        void deleteUser();
        void updateUser();
        void selectUser();
    }
    

    实现类:

    public class UserServiceImpl implements UserService {
        @Override
        public void addUser() {
            System.out.println("增加了一个User");
        }
    
        @Override
        public void deleteUser() {
            System.out.println("删除了一个User");
        }
    
        @Override
        public void updateUser() {
            System.out.println("修改了一个User");
        }
    
        @Override
        public void selectUser() {
            System.out.println("查询了一个User");
        }
    }
    

    创建处理程序类:

    //用这个类自动生成动态代理类!
    public class ProxyInvocationHandler implements InvocationHandler {
    
        //被代理的接口(直接写object可以使该类变为通用的)
        private Object target;
        public void setTarget(Object target){
            this.target = target;
        }
    
        //得到生成的代理类
        public Object getProxy(){
            return Proxy.newProxyInstance(
                    this.getClass().getClassLoader(),
                    target.getClass().getInterfaces(),
                    this);
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = method.invoke(target, args);
    
            log(method.getName());//方法增强(记录日志)
            return result;
        }
    
        //增强方法
        public void log(String msg){
            System.out.println("执行了"+msg+"方法");
        }
    }
    

    测试类:

    public class TestProxy {
        public static void main(String[] args) {
    
            //真实角色
            UserService userService = new UserServiceImpl();
    
            //代理角色,不存在
            ProxyInvocationHandler pih = new ProxyInvocationHandler();
            pih.setTarget(userService);//设置要代理的对象
    
            //动态生成代理类
            UserService proxy = (UserService) pih.getProxy();
    
            proxy.addUser();
            proxy.deleteUser();
            proxy.updateUser();
            proxy.selectUser();
    
        }
    }
    

    结果:

    增加了一个User
    执行了addUser方法
    删除了一个User
    执行了deleteUser方法
    修改了一个User
    执行了updateUser方法
    查询了一个User
    执行了selectUser方法
    

    相关文章

      网友评论

          本文标题:动态代理

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