zoukankan      html  css  js  c++  java
  • 代理-cglib代理

    jdk的动态代理只可以为接口去完成操作,而cglib它可以为没有实现接口的类去做代理,也可以为实现接口的类去做代理。

    IDB

    package com.bjpowernode.proxy;
    
    /**
     * 代理类和目标类都必须使用同一个接口。 
     */
    public interface IDB {
        
        int insert();
        int delete();
        int update();
    }

    OracleDB 

    package com.bjpowernode.proxy;
    
    /**
     * 这是一个Oracle数据库相关的操作类
     * 
     * 目标类(委托类)。
     */
    public class OracleDB implements IDB{
        public int insert(){
            
            //以下是一个插入操作
            System.out.println("Oracle insert data....");
            try {
                Thread.sleep(526);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 0;
        }
        
        
        public int delete(){
            
            //以下是一个删除操作
            System.out.println("Oracle delete data....");
            try {
                Thread.sleep(569);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            return 0;
        }
        
        
        public int update(){
            
            //以下是一个更新操作
            System.out.println("Oracle update data....");
            try {
                Thread.sleep(456);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            return 0;
        }
        
    }

    CglibProxyFactory

    public class CglibProxyFactory implements MethodInterceptor {
        //得到目标对象
        private Object target;
    
        //使用构造方法传递目标对象
        public CglibProxyFactory(Object target) {
            super();
            this.target = target;
        }
    
    
        //proxy 是代理对象的引用;method 是目标类中的目标方法;args 是目标类中的目标方法的实参;参数四:需要增强的方法的代理
        public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
            System.out.println("这是增强方法前......");
            Object invoke = methodProxy.invoke(target, args);
            System.out.println("这是增强方法后......");
            return invoke;
        }
    
    }

    Test 

    import java.lang.reflect.Proxy;
    
    public class Test {
    
        public static void main(String[] args) {
            
            //创建目标类对象
            IDB db = new OracleDB();
            
            //1.创建Enhancer
            Enhancer enhancer = new Enhancer();
            //2.传递目标对象的class
            enhancer.setSuperclass(db.getClass());
            //3.设置回调操作
            IDB dbProxy = (IDB)enhancer.setCallback(new CglibProxyFactory(db));
            
            
            //通过代理对象中的方法去执行目标对象中的方法。
            dbProxy.insert(); 
            dbProxy.delete(); 
            dbProxy.update();
            
        }
    
    }
  • 相关阅读:
    Lua获取当前时间
    标准库
    Cocos2d-x retain和release倒底怎么玩?
    lua 中处理cocos2dx 的button 事件
    探讨把一个元素从它所在的div 拖动到另一个div内的实现方法
    从 ie10浏览器下Symbol 未定义的问题 探索vue项目如何兼容ie低版本浏览器(ie9, ie10, ie 11 )
    setTimeout里无法调用鼠标事件的event
    浅谈HTTP缓存以及后端,前端如何具体实现HTTP缓存
    window7电脑git设置快捷命令
    从获取点击事件根元素谈 target和currentTarget
  • 原文地址:https://www.cnblogs.com/yangyanbo/p/12370156.html
Copyright © 2011-2022 走看看