*
    0.jdk中的代理即String中说的动态代理
    1.所有的【代理类】都是在运行期生成的,如果没有命名,则名称形如【$proxy0】
    2.所有的【代理类】都是继承于java.lang.reflect.Proxy类,代理类里面有且仅有一个成员变量invoketionHandler,用来保存为【目标对象】定义的【调用处理器】
    3.每个目标对象都绑定一个实现InvocationHandler接口的类,即【调用处理器】
    4.【代理对象】的方法被调用时,【调用处理器】的invoke方法也会被调用
    5.【代理】可以在运行时创建一个实现了一组给定接口的新类,这个类即【代理类】,而且此【代理类】实现了接口中的所有方法,所有这些方法调用了【代理类】中的成员变量invoketionHandler的invoke()方法
    这也是为什么Object proxy=Proxy.newProxyInstance(null,interfaces,handler)中有interfaces的原因,interfaces是个数组,指的是【目标对象】实现的一组接口
    其中的java.lang.reflect.Proxy类就是这里说的【代理】
    注意:【代理类】是指java.lang.reflect.Proxy类子类,【代理对象】是指java.lang.reflect.Proxy类的实例


    *
    代理使用步骤:
    1.先有一个【目标对象】和定义一【调用处理器类】 Object target;Class TraceHandler implements InvocationHandler(){}
    2.再关联此目标对象到此调用处理器的一对象 InvocationHandler hander=new TraceHandler(target);
    3.使用此调用处理器创来建一个代理对象 Object proxy=Proxy.newProxyInstance(null,interfaces,handler);//interfaces=target.getClass().getInterfaces();
    注意:【proxy】应该是【$proxy0】的实例,那么也就是java.lang.reflect.Proxy的实例


    *
    原本proxy只是在运行时实现一组接口,只有在编译时不确定实现什么接口才使用
    现在proxy可以用来做AOP编程,即【调用处理器】中调用一个已实现这组接口的类的方法,在这个方法调用之前或之后添加部分代码,也就成为这个类的方法的代理了


    *
    虽然可以动态创建类,但是不能动态改变一个类或一个变量类型,所以java不是动态语言


    *
    静态代理:传统的代理模式的实现,需要在源代码中添加一些附加的类。这些类一般是手写或是通过工具来自动生成。
    动态代理:JDK 5引入的动态代理机制,允许开发人员在运行时刻动态的创建出代理类及其对象。


    *
    AOP属于动态代理的一种特殊形式:
    特殊在:【目标对象】是【一组接口】的实现类的对象
    动态代理中的【目标对象】完全可以是任何一个对象,或者没有此对象,而且不与【一组接口】有任何关系
    【目标对象】只是被用来当做实现【一组接口】的一种方式,我们可以选择在【调用处理器】的invoke()方法中自己编写实现代码,而不是去调用【目标对象】的方法


    *
    对编程语言的理解:
    编程语言只是一种语法,一种约定,xx编译器或xx引擎现实了这种编程语言
    如:Widgets引擎是javascript的一种实现,居然提供了windows API的调用方式