zoukankan      html  css  js  c++  java
  • JDK动态代理和CGLIB动态代理

     JDK动态代理

    //1.影星接口

    package com.entity;
    
    //影星接口
    public interface MovieStar {
    
        public void act();//演戏
    }

    //2.被代理类----实现一个接口

    package com.entity;
    
    //成龙
    public class ChengLongStar implements MovieStar{
    
        @Override
        public void act() {
            System.out.println("我是成龙,我会拍戏");
        }
    
    }

    //3.代理类----实现InvocationHandler接口

    package com.entity;
    
    import java.lang.reflect.InvocationHandler;//java的设计模式
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    //成龙的经纪人类
    public class ChengLongProxy implements InvocationHandler{
        
        //被代理的原始对象
        private Object orientObject;//被代理对象
    
        //绑定被代理对象,返回一个代理对象
        public Object bind(Object obj){
            this.orientObject=obj;
            return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
        }
        
        //演戏之前要做的事情
        public void beforeAct(){
            System.out.println("谈档期...");
            System.out.println("谈片酬...");
            System.out.println("谈广告合作...");
            System.out.println("签合同...");
        }
        
        //演戏之后要做的事情
        public void afterAct(){
            System.out.println("出席首映式...");
            System.out.println("出席颁奖典礼...");
        }
        
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Object result;
            
            beforeAct();
            
            //调用成龙的演戏方法
            result=method.invoke(this.orientObject,null);//利用反射调用方法
            
            afterAct();
            return result;
        }
    
    }

    //4.测试类

    package com.entity;
    
    import org.junit.Test;
    
    public class ChengLongProxyTest {
        @Test
        public void fun1(){
            //创建成龙对象
            MovieStar chengLong=new ChengLongStar();
            //成龙经纪人对象
            ChengLongProxy proxy=new ChengLongProxy();
            //把成龙和成龙经纪人绑定,返回有经纪人的成龙对象
            chengLong= (MovieStar) proxy.bind(chengLong);
            chengLong.act();
            
        }
    }

    //结果

    谈档期...
    谈片酬...
    谈广告合作...
    签合同...
    我是成龙,我会拍戏
    出席首映式...
    出席颁奖典礼...

    CGLIB是借助反编译实现的

     1.抽象类

    package com.entity;
    
    //影星抽象类
    public abstract class MovieStar {
    
        //抽象方法
        public abstract void act();//演戏
    }

    2.被代理类

    package com.entity;
    
    //成龙
    public class ChengLongStar extends MovieStar{
    
        @Override
        public void act() {
            System.out.println("我是成龙,我会拍戏");
        }
    
    }

    3.代理类

    package com.entity;
    
    import java.lang.reflect.Method;
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    //成龙的经纪人类
    public class ChengLongProxy implements MethodInterceptor {
    
        // 被代理对象
        public Object orientObject;//
    
        public Object bind(Object obj) {
            this.orientObject = obj;
            Enhancer enhancer = new Enhancer();
            // 获得被代理对象的父类
            enhancer.setSuperclass(obj.getClass().getSuperclass());
            enhancer.setCallback(this);
            return enhancer.create();// 返回一个代理对象
        }
    
        // 演戏之前要做的事情
        public void beforeAct() {
            System.out.println("谈档期...");
            System.out.println("谈片酬...");
            System.out.println("谈广告合作...");
            System.out.println("签合同...");
        }
    
        // 演戏之后要做的事情
        public void afterAct() {
            System.out.println("出席首映式...");
            System.out.println("出席颁奖典礼...");
        }
    
        @Override
        public Object intercept(Object obj, Method method, Object[] args,
                MethodProxy proxy) throws Throwable {
            Object result;
            
            beforeAct();
            
            //调用成龙演戏
            result=method.invoke(orientObject, null);
            
            afterAct();
            
            return result;
        }
    
    }

    4.测试结果:

    谈档期...
    谈片酬...
    谈广告合作...
    签合同...
    我是成龙,我会拍戏
    出席首映式...
    出席颁奖典礼...
    

      

     

  • 相关阅读:
    hdu 2444 交叉染色判断二分图+二分最大匹配
    uva 交叉染色法10004
    poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)
    poj 3177&&poj 3352加边构双联通(有重边)用tarjan 模板求的
    poj 3006水题打素数表
    POJ 3352 无向图边双连通分量,缩点,无重边
    hdu 1430 魔板 康托展开 + 很好的映射
    D. Artsem and Saunders 数学题
    vijos P1412多人背包 DP的前k优解
    1475 建设国家 DP
  • 原文地址:https://www.cnblogs.com/xjs1874704478/p/11212102.html
Copyright © 2011-2022 走看看