大家应该都知道动态代理,在java中动态代理有两种实现方式 CGLIB PROXY
CGLIB :是通过继承的方式来实现的,所以无法代理 FINAL的类
PROXY; 是通过实现接口的方式来实现的,所以返回的结果是需要通过接口去接
通过代理后:就可以在代码中为所欲为的地方,添加自己的拦截器了, 这其实也就是AOP了
两个例子
CGLIB:
public class CGLIBProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
/**
* 获取代理对象
* @param obj 传入想要被代理的对象
* @return 返回代理新的代理对象
*/
public Object getProxy(Class clazz){
//设置父类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//创建子类实例
return enhancer.create();
}
/**
*这是一个回调的方法
*被代理类的所有方法都会被拦截
*/
public Object intercept(Object obj, Method method, Object[] args,MethodProxy methodproxy) throws Throwable {
System.out.println("可以在方法执行前为所欲为");
//调用父类中的方法
Object result = methodproxy.invokeSuper(obj, args);
System.out.println("可以在方法后为所欲为");
return result;
}
}
PROXY:
public class DynamicProxy implements InvocationHandler{
private Object obj = null;
/**
* 获取代理对象
* @param obj 传入想要被代理的对象
* @return 返回代理新的代理对象
*/
public Object getNewInstance(Object obj) {
this.obj = obj;
//通过接口方式创建实例
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
/**
*这是一个回调的方法
*被代理类的所有方法都会被拦截
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("可以在方法执行前为所欲为");
//通过代理类调用父类中的方法
Object result = method.invoke(this.obj, args);
System.out.println("可以在方法后为所欲为");
return result;
}
}