黑马程序员—动态代理模式

本文介绍了Java中的动态代理模式,重点讲解了Proxy类的构造函数和getProxyClass方法,这两个核心组成部分帮助我们创建并获取代理类,从而实现对真实类的代理操作。

                                        ------- android培训java培训、期待与您交流! ----------

1.概念:
(1).JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理。
(2).JVM生成的动态代理类必须实现一个或多个接口。所以,JVM生成的动态类只能用作具有相同接口的目标类的实现类。
(3).CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理。所以,如果要为一个没有实现接口的类生成动态代理类,那么可以用CGLIB库。
(4).代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理类中的如下四个位置加上系统功能代码:
a.在调用目标方法之前;
b.在调用目标方法之后;
c.在调用目标方法前后;
c.在处理目标方法异常的catch块中;

2.一般主要涉及到以下两个类 : 
(1). Interface InvocationHandler :该接口中仅定义了一个方法 Object invoke(Object obj,Method method, Object[] args) 。在实际使用时,第一个参数 obj 一般是指代理类, method 是被代理的方法 args 为该方法的参数数组。这个抽象方法在代理类中动态实现。 

(2).Proxy:该类即为动态代理类,其中主要包含以下内容: 

Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。 

Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。 

Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) :返回代理类的一个实例,返回后的代理类可以当作被代理类使用 。 

3. 所谓 Dynamic Proxy 是这样一种 class :它是在运行时生成的 class ,在生成它时你必须提供一组 interface 给它,然后该 class 就宣称它实现了这些 interface 。你当然可以把该 class 的实例当作这些 interface 中的任何一个来用。当然啦,这个 Dynamic Proxy 其实就是一个 Proxy ,它不会替你作实质性的工作,在生成它的实例时你必须提供一个 handler ,由它接管实际的工作。

4.创建动态代理的步骤
(1).创建一个实现接口InvocationHandler的类,它必须实现invoke方法;
(2).创建被代理的类以及接口;
(3).通过Proxy的静态方法:newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)创建一个代理;
(4).通过代理调用方法;

例子:
抽象角色
package  com.nan.proxi;
public  interface  Subject {
      public  void  request();
}

代理角色
/*
 * 该代理类的内部属性是Object类型,实际使用的时候通过该类的构造方法传递进来一个对象;
 * 此外,该类还实现了invoke方法,该方法中method.invoke其实就是调用被代理对象的将要执行的方法,
 * 方法参数是sub,表示该方法从属于sub。通过动态代理类,我们可以在执行真实对象的方法的前后写上自己
 * 额外的方法
 */
public  class  ProSubject  implements  InvocationHandler {
      private  Object  sub  =  null ;
      public  ProSubject(Object obj){
             this .  sub  = obj;
     }
     
      @Override
      public  Object invoke(Object proxy, Method method, Object[] args)
                  throws  Throwable {
           System.  out .println(  "before calling:" +method);
           Object obj =  method.invoke(  sub , args);
           System.  out .println(  "after calling:" +method);
           
            return obj ;
     }
}

真实角色
package  com.nan.proxi;
public  class  RealSubject  implements  Subject {
      @Override
      public  void  request() {
           System.  out .println(  "我被代理了!"  );
     }
}

操作类
package  com.nan.proxi;
import  java.lang.reflect.InvocationHandler;
import  java.lang.reflect.Proxy;

public  class  TestMain {
      public  static  void  main(String[] args) {
           RealSubject rs =  new  RealSubject();
           InvocationHandler handler =  new  ProSubject(rs);
           Class<?> classType = handler.getClass();

           Subject subject = (Subject) Proxy. newProxyInstance(
                     classType.getClassLoader(), rs.getClass().getInterfaces(),  handler);   //生成代理

           subject.request();
     }
}

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值