转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41597219


JavassistProxyFactory:利用字节码技术来创建对象

public <T> T getProxy(Invoker<T> invoker,Class<?>[] interfaces) {

       return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker));

}

看似跟jdk生成代理一样, 其实这里的Proxy类不是jdk中自带那个生成代理对象的类是:

  com.alibaba.dubbo.common.bytecode.Proxy

这个dubbo自己写的Proxy类,利用要代理的接口利用javassist工具生成代理代码。

获取Invoker 对象

    public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {

        final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);

        return new AbstractProxyInvoker<T>(proxy, type, url) {

            protected Object doInvoke(T proxy, String methodName,
Class<?>[] parameterTypes, Object[] arguments) throws Throwable { return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
}
};
}

根据传入的 proxy对象的类信息创建对它的包装对象Wrapper

返回Invoker对象实例, 这个invoker对象invoke方法可以根据传入的invocation对象中包含的方法名,

方法参数来调用proxy对象返回调用结果

com.alibaba.dubbo.common.bytecode.Proxy 生成代理对象的工具类

1.      遍历所有入参接口,以;分割连接起来, 以它为key以map为缓存查找如果有,说明代理对象已创建返回

2.      利用AtomicLong对象自增获取一个long数组来作为生产类的后缀,防止冲突

3.      遍历接口获取所有定义的方法,加入到一个集合Set<String> worked中 ,用来判重,

    获取方法y应该在methods数组中的索引下标ix

    获取方法的参数类型以及返回类型

    构建方法体return  ret= handler.invoke(this, methods[ix], args);

    这里的方法调用其实是委托给InvokerInvocationHandler实例对象的,去调用真正的实例方法加入到methods数组中

4.      创建代理实例对象ProxyInstance

    类名为  pkg + “.poxy”+id = 包名 + “.poxy” +自增数值

    添加静态字段Method[] methods;

    添加实例对象InvokerInvocationHandler hanler

    添加构造器参数是InvokerInvocationHandler

    添加无参构造器

    利用工具类ClassGenerator生成对应的字节码

5.      创建代理对象,它的newInstance(handler)方法用来创建基于我们接口的代理

  

代理对象名Proxy + id

继承于Proxy, 所以要实现newInstance方法

添加默认构造器

实现方法newInstance代码, new pcn(hadler) 这里pcn就是前面生成的代理对象类名

利用工具类ClassGenerator生成字节码并实例化对象返回

5.Dubbo原理解析-代理之Javassist字节码技术生成代理 (转)的更多相关文章

  1. Dubbo原理实现之使用Javassist字节码结束构建代理对象

    JavassistProxyFactory利用自己吗技术构建代理对象的实现如下: public <T> T getProxy(Invoker<T> invoker, Class ...

  2. 字节码技术---------动态代理,lombok插件底层原理。类加载器

    字节码技术应用场景 AOP技术.Lombok去除重复代码插件.动态修改class文件等 字节技术优势  Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用 ...

  3. 4. Dubbo原理解析-代理之接口定义 (转)

    转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 一:ProxyFactory的接口定义 impo ...

  4. JVM 内部原理(六)— Java 字节码基础之一

    JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  5. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  6. Javassist 字节码 语法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. 动态字节码技术Javassist

    字节码技术可以动态改变某个类的结构(添加/删除/修改  新的属性/方法) 关于字节码的框架有javassist,asm,bcel等 引入依赖 <dependency> <groupI ...

  8. Java 动态字节码技术

    对 Debug 的好奇 初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些 ...

  9. 图解jvm--(三)类加载与字节码技术

    类加载与字节码技术 1.类文件结构 根据 JVM 规范,类文件结构如下 ClassFile { u4 magic; //魔数 u2 minor_version; //小版本号 u2 major_ver ...

随机推荐

  1. ConfuserEx壳

    前言: 这几天用Rolan的时候出现了点问题,然后发现了这个非常好用的工具居然只有几百k,打算逆向一下,然后发现了ConfuserEx壳 探索: Rolan是用C#写的,刚开始用EXEinfoPE打开 ...

  2. ruby 基础知识 - Class 与 Module

    原文 1. 因為 Ruby 並沒有「屬性」(property/attribute)這樣的設計,要取用實體變數,需要另外定義的方法才行: class Cat def initialize(name, g ...

  3. SecureCRT操作指令

    连接服务器,文件——连接SFTP会话,然后可以help查看命令 传输文件需要明确并处在客户端和服务器端两个正确路径下, 服务器端的操作: cd——去服务器指定的路径 pwd——查看服务器端当前目录 l ...

  4. 已知长度为n的线性表采用顺序结构,写一算法删除该线性表中所有值为item的元素

    /** * @author:(LiberHome) * @date:Created in 2019/2/27 23:34 * @description: * @version:$ */ /*已知长度为 ...

  5. Java ee第四周作业

    代码下载链接:https://github.com/javaee/tutorial-examples/tree/master/web/jsf/hello1 代码内容: /*** Copyright ( ...

  6. 【Python全栈-后端开发】Django进阶2-Form表单

    Django进阶2-Form表单 Django的Form主要具有一下几大功能: 生成HTML标签(可以保留上次输入内容) 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页 ...

  7. TZOJ:3660: 家庭关系

    描述 给定若干家庭成员之间的关系,判断2个人是否属于同一家庭,即2个人之间均可以通过这些关系直接或者间接联系. 输入 输入数据有多组,每组数据的第一行为一个正整数n(1<=n<=100), ...

  8. mixpanel umeng talkingdata

    市面上可以比较容易的接触到的实时大数据用户行为分析系统有很多,比如国外有著名的Mixpanel.Localytics.Google,国内有TalkingData.这些公司都提供基于云的大数据分析系统, ...

  9. abap 断言

    1: Assert equal http://www.saptechnical.com/Tutorials/OOPS/ABAPUnit/Index.htm

  10. DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板

    DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板 难度: ★★☆☆☆(2星) 适用范围: ★★★☆☆(3星) 概况: 当你有多个度量值都需要计算YTD,MoM,而又 ...