public static Object createProxy(Object target) {//这个target是被代理对象
return Proxy.newProxyInstance(ProxyTest.class.getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
//这里的proxy是newProxyInstance返回生成的代理对象,method表示代理对象目前正在调用的方法
//agrs表示代理类调用的方法包含的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("sayHello".equals(method.getName())) {
doBefore();
try {
method.invoke(target, args);
} catch (Exception e) {
doThrowing();
}
doAfter();
}
return null;
}
});
}
JDK动态代理就是通过Proxy.newProxyInstance来创建代理对象的:
第一个参数是ClassLoader:因为此次代理会创建一个接口的实现类,需要将这个类加载到jvm中,所以用到了ClassLoader。 (你要在哪个类里面生成代理对象就传哪个类的ClassLoader)
第二个参数是代理类要实现的所有接口:当你调用这些接口的方法时都会进行拦截。
第三个参数是InvocationHandler,每次调用代理对象的方法时,都会先执行InvocationHandler的invoke方法,在该方法中实现我们的拦截逻辑。