java 动态代理
java 动态代理
代理
java中的代理分为 动态代理
和 静态代理
。
这里的”代理“,可以理解为歌手的经纪人。当你的公司开年会,你想请某个明星来唱歌,你需要去找这个明星的经纪人,由这个经纪人负责安排前期事宜,让明星来唱歌,以及处理后期事宜。
就是由你直接找明星来唱歌,变成你找明星的经纪人,经纪人除了可以让明星来唱歌,还负责了大大小小的事宜。
或者可以这样理解,一个对象是一个宝宝,一个代理对象就是一个打了各种预防针的强化宝宝😂
Spring 中的 AOP机制
就使用到了动态代理。
这里会补充动态代理和静态代理的区别…
动态代理代码实现
java.lang.reflect.Proxy
类提供了为对象生成代理对象的 静态方法
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
- 参数一指定类加载器,可以是任意一个类加载器,一般创建代理对象的方法创建在一个工具包中,这个工具包通常取名为
ProxyUtil
,那么类加载器就使用ProxyUtil.class.getClassLoader( )
。 - 参数二为被代理对象实现的接口数组,假设object为被代理的对象,那么被代理对象实现的接口为
object.getClass( ).getInterfaces( )
返回数组
。
-
参数三用于指定代理对象要干的事情,
InvocationHandler
为接口,通过匿名内部类实现接口的invoke方法,在invoke方法里面编写业务逻辑代码。// InvocationHandler匿名内部类实现 new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method, Object[] args){// 业务逻辑一Object result = method.invoke(object, args); //object为被代理的对象// 业务逻辑二return result;} }
通用代码(创建代理对象的工具类)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {public static <T> T createProxy(T obj) {T proxy = (T) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),obj.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object invoke = method.invoke(obj, args);return invoke;}});return proxy;}
}