hadoop RPC 中用到的JDK开发工具包中的一些类。 主要包括java.lang. reflect 反射机制和动态代理相关类。java.net网络编程库,java.nio(NIO) 1.java反射机制和动态代理 反射机制是java语言的一个重要特性,它允许用户动态获取类的信息和动态调用对象的方法
hadoop RPC中用到的JDK开发工具包中的一些类。
主要包括java.lang.reflect反射机制和动态代理相关类。java.net网络编程库,java.nio(NIO)
1.java反射机制和动态代理
反射机制是java语言的一个重要特性,它允许用户动态获取类的信息和动态调用对象的方法。
Class类 代表一个java类
Field类 代表Java类的属性
Method类 代表Java类的方法
Constructor类 代表java类的构造函数
Array类 提供了动态创建数组,以及访问数组元素的静态方法
Proxy类和InvocationHandler接口 提供了动态生成代理类以及实例的方法。
代理是一种常用的设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。代理类负责为委托类进行预处理,或者执行完后的后续处理。
这是java动态代理机制的主类,它提供了一组静态方法,用于为一组接口动态地生成代理类及对象。
<p class="devcodeoverflow"></p><ol> <li>static InvocationHandler getInvocationHandler(Object proxy) //获取指定代理对象所关联的调用处理器</li> <li>static Class getProxyClass(ClassLoader loader,Class[] interfaces) //获取关联于指定的类装载器和一组接口的动态代理类的对象</li> <li>static boolean isProxyClass(Class cl) //判断指定的类对象是否一个动态代理类</li> <li>static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) //为指定类装载器,一组接口及调用处理器生成动态代理类实例</li> </ol>
这是调用处理器接口。它定义了一个invoke方法,用于处理在动态代理类对象上的方法调用。开发人员需要实现该接口,并在invoke方法中实现对委托类的代理访问。
<p class="devcodeoverflow"></p><ol> <li>//下方法负责处理动态代理类上的所有方法调用。三个参数:代理类实例,被调用的方法,调用参数。</li> <li>Object invoke(Object proxy,Method method,Objects[] args)</li> <li>示例如下:</li> <li>package com.sw.testproxy;</li> <li>import java.lang.reflect.InvocationHandler;</li> <li>import java.lang.reflect.Proxy;</li> <li>import java.lang.reflect.Method;</li> <li>interface CalculatorProtocol {</li> <li> public int add (int a,int b);</li> <li> public int subtract(int a,int b);</li> <li>}</li> <li>class Server implements CalculatorProtocol{</li> <li> @Override</li> <li> public int add(int a, int b) {</li> <li> return a+b;</li> <li> }</li> <li> @Override</li> <li> public int subtract(int a, int b) {</li> <li> return a-b;</li> <li> }</li> <li>}</li> <li>class CalculatorHandler implements InvocationHandler{ </li> <li> private Object objOriginal ;</li> <li> public CalculatorHandler(Object obj){</li> <li> this.objOriginal = obj ;</li> <li> } </li> <li> @Override</li> <li> public Object invoke(Object proxy, Method method, Object[] args)</li> <li> throws Throwable {</li> <li> Object result = method.invoke(this.objOriginal,args);</li> <li> return result;</li> <li> }</li> <li>}</li> <li>public class DynamicProxyExample {</li> <li> public static void main(String[] args) {</li> <li> CalculatorProtocol server = new Server();</li> <li> InvocationHandler handler = new CalculatorHandler(server);</li> <li> CalculatorProtocol client = (CalculatorProtocol)Proxy.newProxyInstance(server.getClass().getClassLoader(),</li> <li> server.getClass().getInterfaces(),handler);</li> <li> int r = client.add(5,3);</li> <li> System.out.println(r);</li> <li> }</li> <li>}</li> </ol>
原文地址:深入解析MapReduce架构设计与实现原理–读书笔记(7)hadoopRPC反射原理, 感谢原作者分享。