• 动态代理(转)


    package cn.itcast.b_dynamic;
    
    // 接口
    public interface IUserDao {
    
        void save();
        
    }
    package cn.itcast.b_dynamic;
    
    /**
     * 目标对象
     * @author Jie.Yuan
     *
     */
    public class UserDao implements IUserDao{
    
        @Override
        public void save() {
            System.out.println("-----已经保存数据!!!------");
        }
    
    }
    package cn.itcast.b_dynamic;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * 给所有的dao创建代理对象【动态代理】
     * 
     * 代理对象,不需要实现接口
     * @author Jie.Yuan
     *
     */
    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 returnValue = method.invoke(target, args);
                            
                            System.out.println("提交事务");
                            return returnValue;
                        }
                    });
        }
    }
    package cn.itcast.b_dynamic;
    
    public class App {
    
        public static void main(String[] args) {
            // 目标对象
            IUserDao target = new UserDao();
            // 【原始的类型 class cn.itcast.b_dynamic.UserDao】
            System.out.println(target.getClass());
            
            // 给目标对象,创建代理对象
            IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
            // class $Proxy0   内存中动态生成的代理对象
            System.out.println(proxy.getClass());
            
            // 执行方法   【代理对象】
            proxy.save();
        }
    }
  • 相关阅读:
    实现who
    团队作业(一)——团队展示
    实验二 OpenSSL API使用
    cat userlist
    mypwd
    实验二 OpenSSL安装
    《Unix/Linux系统编程》第五章学习笔记 20201209戴骏
    团队展示——队员风采
    go module的常规操作
    磁盘空间满排查
  • 原文地址:https://www.cnblogs.com/Damon-Luo/p/5685133.html
Copyright © 2020-2023  润新知