架构系列——java动态代理中的InvocationHandler和Proxy

简介: 架构系列——java动态代理中的InvocationHandler和Proxy

前言

先赞后看,此生必赚!

Java中动态代理的实现,主要是InvocationHandler和Proxy的使用。

可以通过以下步骤实现一个动态代理:

一、创建正常的接口以及实现类

1. 接口:

public interface People {
  public void working();
}

2. 实现类:

public class Student implements People {
  @Override
  public void work() {
    System.out.println("正在学习...");
  }
}

二、创建一个PeopleHandler实现InvocationHandler

public class PeopleHandler implements InvocationHandler {
  private Object obj;
  public PeopleHandler(Object obj) {
    this.obj = obj;
  }
  public Object getProxy(Object obj) {
    return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("before invoke...");
    Object result = method.invoke(obj, args);
    System.out.println("after invoke...");
    return result;
  }
}u

解读:

PeopleHandler(Object obj):通过被代理对象创建handler;


getProxy(Object obj):通过被代理对象创建代理;


invoke(Object proxy, Method method, Object[] args):代理不直接调用invoke,而是使用正常的方法时都会走invoke方法;

三、调用方法

可以使用两种方式调用方法:

1. 直接调用

不使用代理类直接调用,直接实现业务逻辑

2. 使用代理类调用

使用代理类调用,间接实现业务逻辑

public class TestProxy {
  public static void main(String[] args) {
    //1.直接调用
    System.out.println("直接调用:");
    People people = new Student();
    people.work();
    //2.通过代理调用
    System.out.println("\n通过代理调用:");
    PeopleHandler handler = new PeopleHandler(people);
    People proxy = (People) handler.getProxy(people);
    proxy.work();
  }
}

结果:

直接调用:
正在学习...
通过代理调用:
before invoke...
正在学习...
after invoke...

四、总结

1. 使用代理的好处

从上面的案例可以看出,两者都可以实现正常的业务逻辑,那为啥要多此一举地使用代理类呢?

1.1 降低耦合度

正常逻辑work()与日志的关系没那么强烈,可以对业务逻辑的各个部分进行隔离。


1.2 提高可重用性

如果不使用代理,需要每一次在调用work()前后都要写日志,这样的话,代码的可重用性为0!


使用代理之后,只需要在handler的invoke()方法中写一次即可,重用性明显提高!


2. 使用场景

除了上面案例中的日志,还有性能统计,安全控制,事务处理,异常处理等等。


安全控制举例:


校验用户权限,每一个菜单请求,都要判断一下请求的用户是否有该菜单权限。菜单多了,代码冗余,且容易遗漏。


通过动态代理就可以实现为:每一个用户,每一个菜单的请求,都经过代理(proxy),由他判断是否有权限,调用者只需要调用,实现自己的逻辑,不关心权限问题。


相关文章
|
6天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
183 10
|
3月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
53 0
[Java]代理模式
|
2月前
|
Java
JAVA 静态代理 & 动态代理
【11月更文挑战第14天】静态代理是一种简单的代理模式实现,其中代理类和被代理类的关系在编译时已确定。代理类实现与被代理类相同的接口,并持有被代理类的实例,通过调用其方法实现功能增强。优点包括代码结构清晰,易于理解和实现;缺点是对于多个被代理类,需为每个类编写相应的代理类,导致代码量大增,维护成本高。动态代理则在运行时动态生成代理类,更加灵活,减少了代码冗余,但可能引入性能损耗和兼容性问题。
|
4月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
508 37
|
3月前
|
Java
深入理解Java动态代理
深入理解Java动态代理
97 1
|
4月前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
86 18
|
3月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
4月前
|
Kubernetes Java Android开发
用 Quarkus 框架优化 Java 微服务架构的设计与实现
Quarkus 是专为 GraalVM 和 OpenJDK HotSpot 设计的 Kubernetes Native Java 框架,提供快速启动、低内存占用及高效开发体验,显著优化了 Java 在微服务架构中的表现。它采用提前编译和懒加载技术实现毫秒级启动,通过优化类加载机制降低内存消耗,并支持多种技术和框架集成,如 Kubernetes、Docker 及 Eclipse MicroProfile,助力开发者轻松构建强大微服务应用。例如,在电商场景中,可利用 Quarkus 快速搭建商品管理和订单管理等微服务,提升系统响应速度与稳定性。
128 5
|
3月前
|
设计模式 缓存 Java
从源码学习Java动态代理|8月更文挑战
从源码学习Java动态代理|8月更文挑战