JAVA动态代理的核心类是java.lang.reflect.Proxy
类结构如下所示:
其中核心的方法是newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)。
这个方法需要三个参数:ClassLoader,用于加载代理类的 Loader 类,通常这个 Loader 和被代理的类是同一个 Loader 类。Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于执行除了被代理接口中方法之外的用户自定义的操作, 他也是用户需要代理的最终目的。用户调用目标方法都被代理到 InvocationHandler 类中定义的{wy}方法 invoke 中。InvocationHandler是一个接口类,使用反射方法调用目标类中的方法,无论是否是公共的方法。
一般我们代理出来的类需要实现它所有的接口,而默认的getInterfaces方法只能获取该类自身所实现的接口,通过父类继承下来的接口就不能获取到了,此时只能递归获取所有的接口类。
以下的代码可以获取需要代理的类中的所有接口
-----------------------------------------------------
List
interfacelist = new ArrayList();
Class clazz
= UserManagerImpl.class;
while (true)
{
interfacelist.addAll(Arrays.asList(clazz.getInterfaces()));
clazz =
clazz.getSuperclass();
if
(clazz.getSimpleName().equals("Object")) {
break;
}
}
Class[]
interfaces = new Class[interfacelist.size()];
for(int i =
0; i < interfaces.length; i++) {
interfaces[i] = (Class)interfacelist.get(i);
}
-----------------------------------------------------
当调用代理出来的类中的方法,将会是调用 InvocationHandler 的 invoke 方法。整个代理就是这样实现的。
如果说AOP非常高深莫测的话,那么明白了JDK代理机制以后,就比较容易了解其中的实现机制了。
理论上其充当的是类似于InvocationHandler的角色而已。
类结构如下所示:
其中核心的方法是newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)。
这个方法需要三个参数:ClassLoader,用于加载代理类的 Loader 类,通常这个 Loader 和被代理的类是同一个 Loader 类。Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于执行除了被代理接口中方法之外的用户自定义的操作, 他也是用户需要代理的最终目的。用户调用目标方法都被代理到 InvocationHandler 类中定义的{wy}方法 invoke 中。InvocationHandler是一个接口类,使用反射方法调用目标类中的方法,无论是否是公共的方法。
一般我们代理出来的类需要实现它所有的接口,而默认的getInterfaces方法只能获取该类自身所实现的接口,通过父类继承下来的接口就不能获取到了,此时只能递归获取所有的接口类。
以下的代码可以获取需要代理的类中的所有接口
-----------------------------------------------------
-----------------------------------------------------
当调用代理出来的类中的方法,将会是调用 InvocationHandler 的 invoke 方法。整个代理就是这样实现的。
如果说AOP非常高深莫测的话,那么明白了JDK代理机制以后,就比较容易了解其中的实现机制了。
理论上其充当的是类似于InvocationHandler的角色而已。
已投稿到: |
|
---|