zoukankan      html  css  js  c++  java
  • 动态代理(转)

    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();
        }
    }
  • 相关阅读:
    c++的socket编程 tcp
    qt下载
    定义数组类型
    虚析构函数
    运算符重载
    友元函数
    const成员函数
    静态成员变量,静态成员函数
    linux安装mysql
    智能指针
  • 原文地址:https://www.cnblogs.com/Damon-Luo/p/5685133.html
Copyright © 2011-2022 走看看