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();
            
        }
    
    }
  • 相关阅读:
    HDU 1069 Monkey and Banana
    HDU 1029 Ignatius and the Princess IV
    HDU 1024 Max Sum Plus Plus
    Gym100923H Por Costel and the Match
    Codeforces 682C Alyona and the Tree
    Codeforces 449B Jzzhu and Cities
    Codeforces (ccpc-wannafly camp day2) L. Por Costel and the Semipalindromes
    Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum
    Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
    快乐数问题
  • 原文地址:https://www.cnblogs.com/yangyanbo/p/12370156.html
Copyright © 2011-2022 走看看