`

5、Dubbo之Javassist字节码技术生成代理

 
阅读更多

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

 

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

       return (T) Proxy.getProxy(interfaces).newInstance(newInvokerInvocationHndler(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().inde xOf('$') < 0 ?proxy.getClass() : type);

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

       protected Object doInvoke(T proxy,String methodName,

               Class<?>[] parameterTypes,Object[] arguments) throws Throwable {

                returnwrapper.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)方法用来创建基于我们接口的代理

    // create Proxy class.
            String fcn = Proxy.class.getName() + id;
            ccm = ClassGenerator.newInstance(cl);
            ccm.setClassName(fcn);
            ccm.addDefaultConstructor();
            ccm.setSuperClass(Proxy.class);
            ccm.addMethod("public Object newInstance(" + InvocationHandler.class.getName() + " h){ return new " + pcn + "($1); }");
            Class<?> pc = ccm.toClass();
            proxy = (Proxy)pc.newInstance();

 

代理对象名Proxy + id

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

添加默认构造器

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

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

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    服务治理中间件dubbo原理解析

    这些动态生成的类通常是基于现有的模板或者通过字节码技术来创建的。 例如,Dubbo使用Javassist库来生成代理类。Javassist是一种强大的字节码操作工具,可以用来动态创建和修改Java类。通过这种方式,Dubbo能够在...

    服务治理中间件 dubbo原理解析

    Dubbo为了提高性能,避免反射调用的开销,采用了Javassist这一字节码操作库来实现动态代理和编译。Javassist可以读取、编辑和生成字节码文件,从而允许开发者在运行时修改类的定义,生成新的类文件。这在Dubbo实现...

    dubbo启动生成的自适应类.rar

    自适应类的生成是Dubbo为了实现这一目标而引入的关键技术。 1. **自适应注解 (@Adaptive)**: 在Dubbo的API接口中,有时会看到`@Adaptive`注解,这个注解用于标记某个方法将由Dubbo自动生成的自适应实现来处理。当...

    pafa5 dubbo admin

    【标题】"pafa5 dubbo admin" 是一个基于Dubbo框架的服务治理平台,它提供了对Dubbo服务的全面监控和管理能力。Dubbo是阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,用于构建分布式微服务系统。在大型企业...

    dubbo的技术文档

    这份技术文档将带你深入了解Dubbo的核心概念、功能特性以及如何在实际项目中应用。 1. **服务提供者与消费者**: - **服务提供者(Provider)**:提供服务的实体,它可以是一个应用、一个服务接口或其实现。 - **...

    dubbo admin +zk

    ZooKeeper本质上是一个分布式的小文件存储系统。原本是Apache Hadoop的一个组件,现在被拆分为一个Hadoop的独立子项目,在Hbase(Hadoop的另外一个被拆分出来的子项目,用于分布式环境下的超大数据量的DBMS)中也...

    Dubbo源码服务通信及负载均衡.pdf

    Dubbo默认使用Javassist库来生成动态代理,它能够根据接口生成对应的字节码,从而在运行时创建代理对象。`JavassistProxyFactory.getProxy`方法用于生成这个代理,它接收一个Invoker作为参数,这是一个服务提供者的...

    SpringBoot+Dubbo+MyBatis代码生成器

    SpringBoot+Dubbo+Mybatis代码生成器,基于mysql一键生成rest、rpc、service、domain、dao模块,并集成了swagger。启动类在main模块下。 数据表中要有id、version、ts、yn几个基础字段,详见demo文件夹下的示例。...

    dubbo资源 dubbo-admin dubbo demo

    【标题】"dubbo资源 dubbo-admin dubbo demo" 提供的是关于Apache Dubbo的相关素材,主要包括了Dubbo-admin的管理和示例项目。Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了丰富的服务治理功能,是阿里...

    Dubbo框架技术开发文档

    【Dubbo框架技术开发文档】 Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java RPC框架,它专注于服务治理,提供了服务注册、发现、调用、负载均衡、容错、监控等一系列完整的服务治理方案。本文档将深入探讨Dubbo...

    dubbo的初级到高级,分布式系统架构视频

    - **动态代理**:Dubbo利用JDK动态代理或者CGLIB等方式,为服务消费者动态地生成一个实现了所需接口的对象。 - **集群容错**:Dubbo提供了多种集群容错方案,如Failover Cluster、Failsafe Cluster、Failfast ...

    smart-doc是一款同时支持java restful api和apache dubbo rpc接口文档生成的工具

    smart-doc[smɑːt dɒk]是一款同时支持JAVA REST API和JAVA WebSocket和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型定义推导的理念, 完全基于接口源码来分析生成接口文档,不采用...

    dubbo示例代码dubbo-sample

    【Dubbo 示例代码详解】 Dubbo 是阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它主要提供了RPC(远程过程调用)服务,并且包含了服务注册与发现、负载均衡、容错处理、监控等全面的服务治理功能。本示例...

    incubator-dubbo-dubbo-2.6.1

    【标题】"incubator-dubbo-dubbo-2.6.1" 是一个Apache Incubator项目Dubbo的特定版本,这里的2.6.1表示该版本是Dubbo的稳定分支之一。 【描述】提到的"incubator-dubbo-dubbo-2.6.1"表明这是Apache孵化器中的Dubbo...

    Spring Boot集成dubbo+zookeeper

    在IT行业中,Spring Boot是一个备受推崇的框架,它简化了基于Spring的应用开发,而Dubbo则是一个高性能、轻量级的Java服务治理框架。Zookeeper是Apache的一个分布式协调服务,常用于分布式应用中的配置管理、命名...

    dubbo-dubbo-2.7.3.rar

    dubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo...

    Dubbo之《尚硅谷》学习笔记.md

    Dubbo之《尚硅谷》学习笔记

    dubbo使用例子 dubbo使用例子

    6. **创建服务代理**:Dubbo会自动为服务消费者生成服务代理类,使得消费者可以像调用本地方法一样调用远程服务。 7. **编写ControllerOne**:在控制器中,通过服务代理调用服务提供者提供的服务,完成业务逻辑。 ...

    dubbodubbo.zip

    《Dubbo技术详解与实战应用》 Dubbo是一款由阿里巴巴开源的高性能、轻量级的服务治理框架,它致力于提供一个简单、高效的分布式服务解决方案。在Java世界里,Dubbo已经成为了微服务架构的重要组成部分,其核心特性...

    Dubbo入门之HelloWorld

    在IT行业中,分布式服务框架是构建大型互联网应用的关键技术之一,Dubbo作为阿里巴巴开源的一款高性能、轻量级的Java RPC框架,受到了广泛的关注和使用。本文将基于"Dubbo入门之HelloWorld"的主题,深入探讨如何从零...

Global site tag (gtag.js) - Google Analytics