为什么要使用动态代理
使用动态代理是为了在不改变目标对象代码的前提下,在目标代码执行前后,可以根据目标方法和参数执行相应的逻辑,以及可以过滤和改变参数的信息。
java中是如何实现代理的:
这里就介绍管理基于接口的java代理 ,主要是用到了一个类和一个接口:
一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的
每一个动态代理类都必须实现InvocationHandler这个接口,这个接口中也只有唯一的一个具体实现方法invoke(),这个方法,当我们通过proxy类生成一个动态代理对象的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用 invoke方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
三个参数的具体意思:
proxy:生成的代理类对象
method:被代理类的某个具体方法
arg0:实现方法的具体参数
接口大概介绍完了,下面来介绍如何生成具体的代理类对象;
Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
三个参数的具体意义:
loader:类加载器,一般使用被代理类的类加载器,当然使用接口的类加载器也是可以的
InvocationHandler:表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了