java--设计模式之动态代理3

利用动态代理模式实现。

带标注的动态代理构造者

只要某个业务方法上带有@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) {
		//1.被代理对象
		ICalFab calFab = new CalFabImpl();
		//2.利用动态代理构造代理对象
		DynamicProxyBuilderr proxyBuilder = new DynamicProxyBuilderr(calFab);
		ICalFab proxy = (ICalFab)proxyBuilder.newProxyInstance();
		//3.利用代理对象调用业务方法
		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;
		}
		
	}
}

发布了26 篇原创文章 · 获赞 9 · 访问量 287

猜你喜欢

转载自blog.csdn.net/weixin_45430616/article/details/102800764