Java Proxy 理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/felixking/article/details/53946227

Java 的 Proxy 是指 在运行时 动态构造出 一个接口的 实现类(也可以是一次实现多个接口的一个类), 并创建出一个实例 (如果该类之前有动态构造过, 就直接创建实例), 这个实例中所有方法的实现 都是 调用 一个指定好的 InvocationHandle 对象 的 invoke 方法, 通常的做法是 在 InvocationHandle 中(其实应该是派生类) 包含一个真正的实现类的对象, 由 invoke 方法的 method 参数 可以 知道调用的是哪个方法, args 是 参数, 如果 这个 真正实现类的对象 也是 之前接口 的 实现类的话 就可以直接 使用 method.invoke

神奇的地方并不是设计如何调用, 而是 Proxy 的 newProxyInstance 的内部是如何构造出那个实现类的
看源码发现 是 通过拼接字节码形成了一个 .class 文件, 然后 用 ClassLoader 去动态加载它

这里的 .Class 类似 C# 中的 dll(托管的), 然后由 Assembly 来加载它, 拼接字节码 有点类似于 C# 中的 CodeDom 动态构造代码, 但不一样的是, C# 动态构造出的 CodeDom 最终会存成 .cs 文件, 然后通过编译才能形成 dll, 然后程序才能使用, 而 字节码不用, 它更像是 .Net 的中间代码, 它是可以在 JVM 上直接运行的

由此可以看出, 这个特性C#中是没有的(至少目前没有, dll标准还是很复杂的, 目前只有通过编译的动作才能得到它)

猜你喜欢

转载自blog.csdn.net/felixking/article/details/53946227