亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

模式的秘密---代理模式,了解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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消