[读书笔记]深入解析MapReduce架构设计与实现原理——CH4 Java反

这两个都在java.lang.reflect中。

一、反射机制Java的反射机制是针对一个未经过编译的class,对于任意class,可以获取到类的所有属性和方法,对于任意的对象,也可以获取到对象的任意属性和方法。主要通过java中的Class类实现。(注意这个Class区别于小写的class,class是java中的关键字,而此处的Class是Java中一个特殊的类)Java的反射机制来源于Java的编译机制,Java中是将.java文件编译为.class文件(字节码),然后再讲.java文件编译为二进制文件运行,Java允许在运行时进行类型检测,而反射机制就是“自审”的途径。Java的反射机制可以参考以下链接文章:http://blog.csdn.net/justinavril/article/details/2873664

其实Java的反射机制最主要的作用就是Java在编译时候进行类型和格式的“自审”,因此可以通过getClass获取到类,然后获取到类中的所有方法和属性。

二、动态代理,两个相关类:interfaceInvocationHandler & class Proxy。动态代理的委托对象可以是接口,也可以是类。Interface InvocationHandler,每个proxy都有相应的invocation handler,当代理实例的方法被触发时,由invocation handler进行处理。这个接口类用来实现动态代理类对象上的方法调用,即调用某个动态代理类对象的某个方法,所以有三个参数,proxy:代理类,method:proxy代表的代理类对象的方法,args:调用参数,数组形式。返回结果是方法调用的结果。只有一个方法:

     public Object invoke(Object proxy, Method method, Object[] args)        throws Throwable;

Proxy,动态代理机制的主类,用于为接口动态生成代理类及代理对象。为某个接口创建代理类的过程一般为以下几步:

     InvocationHandler handler = new MyInvocationHandler(...);//通过实现InvocationHandler接口创建调用处理器          Class proxyClass = Proxy.getProxyClass(         Foo.class.getClassLoader(), new Class[] { Foo.class });  //通过为Proxy类指定classLoader对象和一组interface创建动态类     Foo f = (Foo) proxyClass.         getConstructor(new Class[] { InvocationHandler.class }).  //通过反射机制获取到类的构造函数,创建一个新的实例         newInstance(new Object[] { handler });

java.lang.reflect.Proxy的具体实现有4种方法:

1. 获取指定代理对象所关联的调用处理器

<span style="white-space:pre"></span>static InvocationHandler getInvocationHandler(Object proxy)

2.获取关联于指定类装载器和一组接口的动态代理类的对象

<span style="white-space:pre"></span>static Class getProxyClass(ClassLoader loader, Class[] interfaces)  //这里就使用了反射机制,注意类型是Class

3.判断指定的类对象是否是一个动态代理类

<span style="white-space:pre"></span>static boolean isProxyClass(Class cl)

4.为指定类装载器、一组接口及调用处理器生成动态代理类实例

<span style="white-space:pre"></span>staitc Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

其实动态代理就是相当于走了一个弯路,调用方法时不直接调用原始类,而是将请求转发到代理类,通过InvocationHandler监测是否调用了某个方法,一旦调用,则触发invoke事件,然后到原始类去调用该方法,而用户的感觉是调用了代理类的方法,实际还是调用了原始类的方法。动态代理可参考:http://langyu.iteye.com/blog/410071。其中有几个问题我很同意,动态代理是一种用于转发请求,进行特殊处理的机制,“动态”应该指的是“运行期”。InvocationHandler可以理解为它用来处理方法的调用,实现类也有同样的意义;与代理类对象相关联则表示,它就是负责处理代理类应该有的动作,把所有的方法请求分发到invoke这个方法上。

这篇文章中的图能够很好地帮助理解动态代理的执行过程。

用最少的悔恨面对过去

[读书笔记]深入解析MapReduce架构设计与实现原理——CH4 Java反

相关文章:

你感兴趣的文章:

标签云: