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动态代理总结:

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

  • 相关阅读:
    莫比乌斯反演套路一--令t=pd--BZOJ2820: YY的GCD
    BZOJ2720: [Violet 5]列队春游
    BZOJ2277: [Poi2011]Strongbox
    莫(meng)比(bi)乌斯反演--BZOJ2301: [HAOI2011]Problem b
    「CodePlus 2017 11 月赛」Yazid 的新生舞会
    「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
    用NumGo实现安卓动画
    人生
    用NumGo实现安卓动画
    html5使用canvas绘制n角星
  • 原文地址:https://www.cnblogs.com/i-hard-working/p/10389612.html
Copyright © 2011-2022 走看看