/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.core.cachepool.proxy.profier; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; import org.apache.log4j.Level; import com.jinhe.tss.core.cachepool.proxy.BaseInvocationHandler; import com.jinhe.tss.core.cachepool.proxy.ProxyUtil; /** * <p> ProxyProfiler.java </p> * * <p>性能测量Proxy实现,适合实现接口的对象。 </p> * <p>计算对象方法的执行时间。 </p> * <p>可指定拦截对象需要被拦截测试的具体方法列。 </p> * * @author Jon.King 2006-8-13 * */ public class ProxyProfiler{ /** * 默认拦截所有的方法。 * @param object 指定拦截对象 * @return */ public static Object frofiler(final Object object){ return ProxyProfiler.frofiler(object, null); } /** * 指定拦截对象,同时指定拦截对象需要被拦截测试的具体方法列。 * @param object 指定拦截对象 * @param invokeMethods 指定拦截对象需要被拦截测试的具体方法列 * @return */ public static Object frofiler(final Object object, final String[] invokeMethods) { Class<?>[] interfaces = ProxyUtil.getInterfaces(object.getClass()); return Proxy.newProxyInstance(object.getClass().getClassLoader(), interfaces, new BaseInvocationHandler(object, invokeMethods){ protected Object before(Object target, Method method, Object[] args){ long startTime = System.currentTimeMillis(); return new Long(startTime); } protected void after(Object target, Method method, Object[] args, Object beforeReturnVal){ long startTime = ((Long)beforeReturnVal).longValue(); long endTime = System.currentTimeMillis(); String argsStr = args != null && args.length > 0 ? Arrays.asList(args).toString() : ""; log.setLevel(Level.INFO); log.info("方法 " + method.getName() + "(" + argsStr + ")" + "执行时间为" + (endTime - startTime) + "ms."); } }); } }