动态代理

转自: https://www.cnblogs.com/gonjan-blog/p/6685611.html.
具体信息参考链接

//接口
public interface Person {
    void giveMoney();
}
//实现
public class Student implements Person {
    String name;
    public Student(String name) {
        this.name = name;
    }
    @Override
    public void giveMoney() {
        System.out.println("上交50元班费");
    }
}
//代理时加入的方法处理
public class MonitorUtil {

    private static ThreadLocal<Long> tl = new ThreadLocal<>();

    public static void start() {
        tl.set(System.currentTimeMillis());
    }

    //结束时打印耗时
    public static void finish(String methodName) {
        long finishTime = System.currentTimeMillis();
        System.out.println(methodName + "方法耗时" + (finishTime - tl.get()) + "ms");
    }
}
//实现InvocationHandler 
public class StuInvocationHandler<T> implements InvocationHandler {
    //持有一个代理对象
    T target;

    //构造方法
    public StuInvocationHandler(T target) {
        this.target = target;
    }

    /**
     * proxy:代表动态代理对象
     * method:代表正在执行的方法
     * args:代表调用目标方法时传入的实参
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理执行" + method.getName() + "方法");
        MonitorUtil.start();
        //反射
        Object o = method.invoke(target,args);
        MonitorUtil.finish(method.getName());
        return null;
    }
}
//动态代理对象
public class ProxyTest {
    public static void main(String[] args) {
        //创建一个实例对象,这个对象是被代理的对象
        Person person = new Student("张三");
        //创建一个与代理对象相关联的InvocationHandler
        InvocationHandler handler = new StuInvocationHandler<Person>(person);
        //创建一个代理对象stuProxy来代理person,代理对象的每个执行方法都会替换执行Invocation中的invoke方法
        /**
         * 第一个参数 : 生成代理对象使用哪个类装载器
         * 第二个参数 : 指明生成哪个对象的代理对象,通过接口指定
         * 第三个参数 : InvocationHandler
         */
        Person stuProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), person.getClass().getInterfaces(), handler);
        //执行方法
        stuProxy.giveMoney();
    }
} 

输出结果:
代理执行giveMoney方法
上交50元班费
giveMoney方法耗时1ms

同样可以参考
[http://www.cnblogs.com/xdp-gacl/p/3971367.html]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值