动态代理
来源:互联网 发布:手机java微信怎么登陆 编辑:程序博客网 时间:2024/06/05 15:25
在客户类(即以下代码的Client类),语句Manager managerProxy =
$Proxy0 对象调用过,怎么能执行invoke方法呢?但是请看$Proxy0中的static代码块,这个模块是特殊的,因为当newProxyInstance创建$Proxy0 时,它就被初始化。而这个static模块中的getMethod方法加载了这个三个方法,因而它们里面的代码(h.invoke())被执行。
一.相关类及其方法:
java.lang.reflect.Proxy类的newProxyInstance(),是用于创建动态代理类和实例的静态方法.返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
java.lang.reflect.InvocationHandler接口中的invoke(),在代理实例上处理方法调用并返回结果。当与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
二.探讨的源代码:
被代理对象的接口及实现类:
public interface Manager {
public void modify();
}
public class ManagerImpl implements Manager {
}
动态代理类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class BusinessHandler implements InvocationHandler {
private Object object = null;
public BusinessHandler(Object object) {
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
}
客户端类:
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
}
三.执行结果:
do something before method
*******modify()方法被调用
do something after method
四.机制分析:
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)做了以下几件事.
(1)根据参数loader和interfaces调用方法 getProxyClass(loader, interfaces)创建代理类$Proxy.$Proxy0类 实现了interfaces的接口,并继承了Proxy类.
(2)实例化$Proxy0并在构造方法中把BusinessHandler传过去,接着$Proxy0调用父类Proxy的构造器,为h赋值,如下:
class Proxy{
}
下面是本例的$Proxy0类的源码(好不容易才把它提出来):
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableExcep
public final class $Proxy0 extends Proxy implements Manager {
private static Method m1;
private static Method m0;
private static Method m3;
private static Method m2;
static {
} //static
public $Proxy0(InvocationHandler invocationhandler) {
}
@Override
public final boolean equals(Object obj) {
}
@Override
public final int hashCode() {
}
public final void modify() {
}
@Override
public final String toString() {
}
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 腾讯面试题:A.txt和B.txt两个文件,A有1亿个qq号,B有100万个,用代码实现交、并、差
- linux目录树
- 《Android应用性能优化》之读书笔记
- [LeetCode] Spiral Matrix II
- web后台+ajax开发
- 动态代理
- delphi 判断一个数组是用length 还是 sizeof
- 图像特征之SUSAN角点
- Veebot-自动静脉抽血机器人
- java中Integer包装类的详细讲解(java二进制操作,所有进制转换)
- iOS crash Log 理解1
- <nine-patch> requires a valid 9-patch source image
- ZigBee学习之17——ZStack API解读5
- SpringAOP嵌套调用的解决办法