java 用 代理模式 打印一个方法的运行时间

// 常规打印一个方法的运行时间,单位:毫秒

long begintime1 = System.currentTimeMillis();

// this is a method
thisIsAMethod();

long endtime1 = System.currentTimeMillis();
long costTime1 = ( endtime1 - begintime1 );
System.out.println( costTime1 );

----------------------------------------------------------------------------------------

写成代理模式,把打印方法运行时间的功能封装到代理类中:

 

将 service 为被代理的对象,调用代理类对象,打印一个 service 方法的运行时间

@RestController
@RequestMapping( "/user" )
public class UserController {

    /**
     * controller
     */
    @RequestMapping( "/callIt" )
    String callIt(){       
        MyProxy myProxy = new MyProxy();

        UserServiceImpl proxyObj = ( UserServiceImpl ) myProxy.getProxy(
                                                 UserServiceImpl.class );

        String userName = "Albert Einstein";

        // 用代理对象 proxyObj 运行 UserServiceImpl 的方法 
        int count = proxyObj.sayHello( userName );

        return userName + ",这是您的第 " + count + " 次登录";
    }

}

service 类,不用做修改:

@Service
public class UserServiceImpl{

    /**
     * sayHello
     */
    public int sayHello(String name){

        int count = 0;

        for(int i = 0; i<100000000; i++){
            count++;
        }

        System.out.println(name + ". And count =" + count);

        return count;
    }

}

 

动态代理类,用 cgLib 实现的,封装了打印方法运行时间的功能

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

// 采用 CGLIB 实现动态代理
public class MyProxy implements MethodInterceptor{

    /**
     * 生成 代理对象
     *
     * @param klass Class类
     * @return Class类的CGLIB对象
     */
    public Object getProxy(Class klass){
        // CGLIB增强类对象
        Enhancer enhancer = new Enhancer();

        // 设置增强类型
        enhancer.setSuperclass(klass);

        // 定义代理逻辑对象为当前对象,要求当前对象实现 MethodInterceptor 方法
        enhancer.setCallback(this);

        // 生成并返回代理对象
        return enhancer.create();
    }

    /**
     * 调用需要代理方法,并且打印方法的运行时间。
     *
     * @param proxy 代理对象
     * @param method 目标方法
     * @param args 目标方法参数
     * @param methodProxy 方法代理
     * @return 代理逻辑返回
     */
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
            throws Throwable {
        //System.out.println("调用真实对象前");

        // 打印这个方法的运行时间,单位:毫秒
        long begintime1 = System.currentTimeMillis();

        // CGLIB 反射调用真实对象方法
        Object result = methodProxy.invokeSuper(proxy, args);

        //System.out.println("调用真实对象后");

        long endtime1 = System.currentTimeMillis();

        long costTime1 = (endtime1 - begintime1);

        System.out.println(method.getName() + " 方法的运行时间(毫秒)=" +costTime1);

        return result;
    }

}

 

运行效果

Albert Einstein. And count = 100000000
sayHello 方法的运行时间(毫秒) = 35

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值