Java动态代理类位于java.lang.reflect包下,一般主要涉及以下两个类:
(1)Interface InvocationHandler:该接口中仅定义了一个方法
public object invoke(Object proxy,Method method,Object[] args)
在实际使用时,第一个参数proxy一般是指代理类对象,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。
(2)Proxy:该类即为动态代理类
static Object newProxyInstance(ClassLoader loader(目标类的类装载器),Class[] interfaces(目标类的接口),InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可以使用被代理类在接口中声明过的方法)。
当客户端调用代理类对象的方法的时候,会调用invoke()回调方法,将其委派给目标对象,并在此基础上进行增强。
jdk动态代理只能代理实现了接口的类,没有实现接口的类,不能实现jdk的动态代理。
CGLIB动态代理:针对类来实现代理,对指定目标类产出一个子类,通过方法拦截技术拦截所有父类方法的调用,然后覆盖其中的方法,实现功能的增强。