zoukankan      html  css  js  c++  java
  • 代理模式---动态代理之JDK

    接口类UserDao:

    package com.ant.jdk8.proxy;
    
    public interface UserDao {
        void save();
    }

    接口类EmployeeDao:

    package com.ant.jdk8.proxy;
    
    public interface EmployeeDao {
        void add();
    }

    目标类UserDaoImpl:

    package com.ant.jdk8.proxy;
    
    public class UserDaoImpl implements UserDao {
        @Override
        public void save() {
            System.out.println("保存用户");
        }
    }

    目标类EmployeeDaoImpl:

    package com.ant.jdk8.proxy;
    
    public class EmployeeDaoImpl implements EmployeeDao {
        @Override
        public void add() {
            System.out.println("添加雇员信息");
        }
    }

    代理类ProxyFactory

    package com.ant.jdk8.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class ProxyFactory {
    
        //维护一个目标对象
        private Object target;
    
        public ProxyFactory(Object target){
            this.target = target;
        }
    
        //生成目标对象的代理对象
        public Object getProxyInstance(){
            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("---开始事务---");
                            Object object = method.invoke(target, args);
                            System.out.println("---提交事务---");
                            return object;
                        }
                    });
        }
    }

    测试类APP:

    package com.ant.jdk8.proxy;
    
    public class App {
        public static void main(String[] args) {
            //目标对象
            UserDao target = new UserDaoImpl();
            //代理对象
            UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
            proxy.save();
    
            System.out.println("==========================");
    
            //目标对象
            EmployeeDao target2 = new EmployeeDaoImpl();
            //代理对象
            EmployeeDao proxy2 = (EmployeeDao)new ProxyFactory(target2).getProxyInstance();
            proxy2.add();
        }
    }
    

    JDK动态代理总结:

    代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理。

  • 相关阅读:
    Algs4-2.3.11快排遇与切分值相同时继续扫描是平方级
    使用kubeadm搭建Kubernetes集群
    kubernetes发布解释型语言应用的最佳实践
    docker化php项目发布方式
    linux服务器免密钥登录
    cp 递归复制时 复制实际文件而不是链接文件
    nginx配置http访问自动跳转到https
    nfs服务器
    nginx防止恶意域名解析
    如何建立自己的知识体系?(摘)
  • 原文地址:https://www.cnblogs.com/i-hard-working/p/10389612.html
Copyright © 2011-2022 走看看