// 常规打印一个方法的运行时间,单位:毫秒
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