为了账号安全,请及时绑定邮箱和手机立即绑定

模式的秘密---代理模式,了解JDK动态代理,小作业

标签:
Java

实现JDK动态代理的时间和日志
时间代理:

package com.proxy.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TimeHandler implements InvocationHandler {
    //定义构造器传递参数
    private Object target;  
    public TimeHandler(Object target) {
        super();
        this.target = target;
    }
    /*参数:
     * proxy 被代理对象
     * method 被代理对象的方法
     * args 方法的参数
     * 返回值:Object方法的返回值
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub
        //进行业务处理,并调用方法
        long starttime=System.currentTimeMillis();
        System.out.println("汽车开始行驶了");
        method.invoke(target);
        long endtime=System.currentTimeMillis();
        System.out.println("汽车结束行驶了,一个行驶了:"+(endtime-starttime)+"毫秒");                          
        return null;
    }
}

日志代理:

package com.proxy.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class LogHandler implements InvocationHandler {
    private Object object;              
    public LogHandler(Object object) {
        super();
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub      
        System.out.println("日志开始了");
        method.invoke(object);      
        System.out.println("日志结束了");
                return null;
    }
}

主函数:

package com.proxy.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.proxy.statics.Car;
import com.proxy.statics.Moveable;
public class JdkMain {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Car car = new Car();
        InvocationHandler ht=new TimeHandler(car);
        InvocationHandler hl=new LogHandler(car);
        //得到Car的class
        Class<?> cls = Car.class;
    /*采用动态代理生成动态代理类 
     *  loader 被代理类的类加载器
     * interfaces 实现的接口
     * h 事件处理器,InvocationHandler
     */
        Moveable mt =(Moveable) Proxy.newProxyInstance(cls.getClassLoader(), 
                cls.getInterfaces(), ht);
        Moveable ml =(Moveable) Proxy.newProxyInstance(cls.getClassLoader(), 
                cls.getInterfaces(), hl);
        mt.move();
        ml.move();
    }
}

代码的执行结果:
图片描述

稍微有点遗憾的是“汽车正在运行中...”这句话显示了两遍,不知道有没有什么方法能只运行一次的。
欢迎大家留言讨论

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消