动态代理简单例子

导入jar包
这里写图片描述

/*
 * 
 * 一个演员
 * 
 * 
 */


public class Actor implements IActor {

    /*
     * 基本的演出
     */
    public void basicAct(float money){
    System.out.println("拿到钱"+money+",开始基本演出");
    }

    public void dangeAtc(float money){
    System.out.println("拿到钱"+money+",开始危险演出");
    }


}
/*
 * 模拟经纪公司对签约演员的标准
 * 
 */

public interface IActor {
    /*
     * 基本的演出
     */
    public void basicAct(float money);

    public void dangeAtc(float money);
}
/*
 * 
 * 模拟一个剧组
 */

public class Client {
    public static void main(String[] args) {
    /*
     * 动态代理:
     *  作用:在不改变源码的基础上,对已有方法的增强(他是AOP思想的实现技术)
     *  分类:
     *      基于接口的动态代理:
     *      要求:被代理类至少实现一个接口
     *      提供者:JDK官方
     *      涉及类:Proxy
     *       创建代理对象的方法:Proxy.newProxyInstance(Classloader, Class[], InvocationHandler);
     *      Classloader:类加载器,
     *      Class[]:字节码数组,被代理类实现的接口.(要求代理对象和被代理对象有相同的方法)
     *      InvocationHandler:一个接口,用于提供增强代码.
     *      策略模式:
     *         
     *      
     *      
     * 
     */
    /*
     * 找一个演员
     */
    final Actor actor = new Actor();

    IActor proxyActor = (IActor) Proxy.newProxyInstance(actor.getClass().getClassLoader(),actor.getClass().getInterfaces(),new InvocationHandler() {
        /*
         * 执行被代理对象的任何方法都会经过该方法
         * 方法的参数:
         *      代理对象的引用
         *      当前执行的方法
         *      当前执行的方法的参数
         * 
         */

        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object rtValue = null;
        //取出方法的参数
        float money = (float)args[0];
        //判断当前执行的是什么方法
        if("basicAct".equals(method.getName())){
            //基本演出
            if(money>10000){
            //剧组抽查一半金额
            money = money/2;
            //执行方法:演出
            rtValue = method.invoke(actor, money);
            }
        }
        if("dangeAtc".equals(method.getName())){
            //危险演出
            if(money>50000){
            //剧组抽查一半金额
            money = money/2;
            //执行方法:演出
            rtValue =  method.invoke(actor, money);
            }
        }
        return rtValue;
        }
    });

    proxyActor.basicAct(10005);
    proxyActor.dangeAtc(70000);
    }
}

/*
 * 模拟经纪公司对签约演员的标准
 * 
 */

public class IActor {
    /*
     * 基本的演出
     */
    public void basicAct(float money){

    }

    public void dangeAtc(float money){

    }
}
/*
 * 
 * 一个演员
 * 
 * 
 */


public class Actor extends IActor {

    /*
     * 基本的演出
     */
    public void basicAct(float money){
    System.out.println("拿到钱"+money+",开始基本演出");
    }

    public void dangeAtc(float money){
    System.out.println("拿到钱"+money+",开始危险演出");
    }


}
/*
 * 
 * 模拟一个剧组
 */

public class Client {
    public static void main(String[] args) {
    /*
     * 基于子类的动态代理
     *  要求:被代理类不能是最终类,不能被final修饰
     *  提供者:第三方CGLib
     *  涉及类:Enhancer
     *  创建代理对象的方法:create(Class,Callback)
     *  参数的含义:
     *      Class:被代理对象的字节码.
     *      Callback:如何代理
     */
    /*
     * 找一个演员
     */
    Actor actor = new Actor();


    Actor cglibActor =  (Actor) Enhancer.create(actor.getClass(), new MethodInterceptor() {
        /*
         * 与基于接口的动态代理的方法作用一模一样
         * 参数:
         *       前面三个参数与基于接口的动态代理的方法的参数一样
         *   MethodProxy:当前执行方法的代理对象
         * 
         */
        @Override
        public Object intercept(Object proxy, Method method, Object[] args,
            MethodProxy methodProxy) throws Throwable {
        Object rtValue = null;
        //取出方法的参数
        float money = (float)args[0];
        //判断当前执行的是什么方法
        if("basicAct".equals(method.getName())){
            //基本演出
            if(money>10000){
            //剧组抽查一半金额
            money = money/2;
            //执行方法:演出
            rtValue = method.invoke(actor, money);
            }
        }
        if("dangeAtc".equals(method.getName())){
            //危险演出
            if(money>50000){
            //剧组抽查一半金额
            money = money/2;
            //执行方法:演出
            rtValue =  method.invoke(actor, money);
            }
        }
        return rtValue;
        }

    });
    cglibActor.basicAct(10005);
    cglibActor.dangeAtc(70000);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值