- 动态代理模式:实现框架底层的核心
1)构建一个对象,构建InvocationHandler对象
2)构建动态代理对象(利用被代理对象和InvocationHandler对象)
public class DynamicProxyDemo {
public static void main(String[] args) {
//1.构建被代理对象
CalFabImpl calFab = new CalFabImpl();
//2.构造InvocationHandLer对象
CalFabInvocationHandler invocationHandler = new CalFabInvocationHandler(calFab);
//3.构造动态代理对象
//arg0:传被代理对象的类加载器对象
//arg1:传被代理对象的所实现的接口
//arg3:传InvocationHandler对象
ICalFab dynameicProxy = (ICalFab)Proxy.newProxyInstance(calFab.getClass().getClassLoader(),
calFab.getClass().getInterfaces(),
invocationHandler);
//4.利用代理对象调用业务方法
System.out.println(dynameicProxy.calFabByLoop(40));
System.out.println(dynameicProxy.calFabByRecursion(40));
}
}
编写InvocationHandler类,要实现InvocationHandler接口
class CalFabInvocationHandler implements InvocationHandler{
private Object target; //被代理对象
public CalFabInvocationHandler(Object targer) {
this.target = target;
}
/*
* proxy:代理对象,这个对象是在程序运行的过程中动态创建出来的。
* method:调用的方法
* args:方法的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//1.业务代码之前增加代码
long start = System.currentTimeMillis();
//2.业务代码
//调用被代理类的业务方法
Object result = method.invoke(target,args);
//3.业务代码之后切入代码
long end = System.currentTimeMillis();
System.out.println((end-start) + "ms");
return result;
}
}