利用动态代理模式实现。
带标注的动态代理构造者
只要某个业务方法上带有@CheckTime标注,就实现计算该方法的执行时间。没有加@CheckTime标注的方法,则不计算该方法的执行时间
public interface ICalFab {
@CheckTime
int calFabByLoop(int n);
@CheckTime
int calFabByRecursion(int n);
}
class CalFabImpl implements ICalFab{
@Override
public int calFabByLoop(int n) {
int n1 = 1;
int n2 = 1;
int n3 = 0;
for(int i = 3;i<=n;i++){
n3 = n1 + n2;
n1 = n2 ;
n2 = n3;
}
return n3;
}
@Override
public int calFabByRecursion(int n) {
if(n == 1 || n == 2) return 1;
return calFabByRecursion(n-1)+calFabByRecursion(n-2);
}
}
class CalFabImplProxy implements ICalFab{
private ICalFab icf;
public CalFabImplProxy(ICalFab icf){
this.icf = icf;
}
@Override
public int calFabByLoop(int n) {
long start = System.currentTimeMillis();
int result =icf.calFabByLoop(n);
long end =System.currentTimeMillis();
System.out.println((end-start)+"ms");
return result;
}
@Override
public int calFabByRecursion(int n) {
long start = System.currentTimeMillis();
int result =icf.calFabByRecursion(n);
long end =System.currentTimeMillis();
System.out.println((end-start)+"ms");
return result;
}
}
public class DynamicProxyDemo03 {
public static void main(String[] args) {
ICalFab calFab = new CalFabImpl();
DynamicProxyBuilderr proxyBuilder = new DynamicProxyBuilderr(calFab);
ICalFab proxy = (ICalFab)proxyBuilder.newProxyInstance();
System.out.println(proxy.calFabByLoop(35));
System.out.println(proxy.calFabByRecursion(35));
}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface CheckTime{}
class DynamicProxyBuilderr{
private Object target;
public DynamicProxyBuilderr(Object target){
this.target = target;
}
public Object newProxyInstance(){
Object newProxyInstance = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new SelfInvocationHandler());
return newProxyInstance;
}
private class SelfInvocationHandler implements InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Annotation[] ann = null;
if((ann = method.getAnnotations()).length ==0){
Object result = method.invoke(target, args);
return result;
}else{
for (Annotation anno : ann) {
if(anno.annotationType().getSimpleName().equals("CheckTime")){
long start = System.currentTimeMillis();
Object result = method.invoke(target, args);
long end =System.currentTimeMillis();
System.out.println((end-start)+"ms");
return result;
}
}
}
return null;
}
}
}