Java零基础-动态代理

举报
喵手 发表于 2024/11/29 01:05:32 2024/11/29
317 0 0
【摘要】 哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这...

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

动态代理是Java中一项非常重要的特性,它可以在运行时创建代理对象,不需要手动编写代理类,从而解耦业务代码和代理逻辑,提高代码的重用性和可维护性。本文将从零基础入门,介绍Java中的动态代理技术,包括基本原理、源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。

摘要

本文首先介绍了动态代理的基本原理,然后通过源代码解析说明代理对象的创建过程,接着介绍了动态代理在实际场景中的应用,包括AOP、RPC、缓存和日志等方面。在优缺点分析中,本文分析了动态代理的优点和缺点,并提出了如何维护代理类和如何解决代理类的可维护性问题。在最后的类代码方法介绍中,本文详细介绍了动态代理中InvocationHandler接口和Proxy类的详细用法。最后,本文提供了测试用例和全文小结。

简介

动态代理是Java中一项重要的特性,它可以在运行时动态生成代理对象,代替手动编写代理类的繁杂工作。动态代理常常和反射机制结合使用,通过反射机制获取代理对象的信息,将代理对象和目标对象进行绑定,然后在调用代理方法时,实际上是调用了绑定的目标对象的方法。

Java中的动态代理主要有两种方式,一种是基于接口的动态代理,一种是基于类的动态代理。基于接口的动态代理是利用JDK自带的Proxy类和InvocationHandler接口实现的,而基于类的动态代理是利用第三方类库cglib实现的。本文主要介绍基于接口的动态代理。

源代码解析

动态代理在Java中的实现是通过Proxy类和InvocationHandler接口来完成的。Proxy类是Java自带的一个类,可以用于创建动态代理对象。InvocationHandler接口是代理对象的调用处理程序,它负责处理代理对象的方法调用,并返回结果。

应用场景案例

动态代理在实际应用中广泛用于AOP、RPC、缓存和日志等方面。

AOP

AOP(面向切面编程)是一种编程范式,用于将应用程序的不同关注点(例如日志记录、事务管理和安全性)从业务逻辑中分离出来。通过动态代理,可以在运行时为目标对象添加切面(即代理对象),从而实现AOP编程。

RPC

RPC(远程过程调用)是一种分布式系统的通信方式,它允许一个计算机程序调用另一个计算机上的程序,而不需要程序员显式编写底层网络通信代码。在RPC中,客户端和服务端之间的通信可以通过动态代理实现。

缓存

缓存是一种常见的优化技术,可以显著提高应用程序的性能。动态代理可以用于实现缓存技术,例如通过缓存代理来减少数据库的查询次数。

日志

日志是应用程序中非常重要的一部分,可以帮助程序员发现潜在的问题并加以解决。动态代理可以用于实现日志技术,例如在代理对象的方法调用前后记录日志信息,从而帮助程序员排查问题。

优缺点分析

动态代理的优点是可以实现代码的重用和可维护性。由于动态代理对业务逻辑和代理逻辑进行了解耦,因此可以使得代码更易于维护和更新。此外,动态代理还可以根据实际需要动态地创建代理对象,从而避免手动编写代理类的繁琐工作。

动态代理的缺点是代理对象的创建过程比较复杂,需要使用反射机制来获取代理对象的信息,并创建代理对象。另外,如果代理类的维护不当,容易导致代理类的代码量过大或者代码逻辑混乱。

类代码方法介绍

InvocationHandler接口

InvocationHandler接口是动态代理中的一个关键接口,负责处理代理对象的方法调用。InvocationHandler接口只有一个方法:

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;

该方法接收三个参数,分别是代理对象、代理方法和参数。代理对象是在运行时生成的一个接口实例,代理方法是在运行时动态创建的代理方法,参数是代理方法的参数。在实际应用中,通常需要在invoke方法中编写代理逻辑,例如在目标方法的调用前后添加一些额外的逻辑。

Proxy类

Proxy类是Java自带的一个类,可以用于创建动态代理对象。Proxy类有两个静态方法可以用于创建代理对象:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

public static Object newProxyInstance(Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

其中,ClassLoader参数是用于指定代理对象的类加载器,interfaces参数是指定代理对象所实现的接口,InvocationHandler参数是指定代理对象的调用处理程序。

测试用例

下面是一个简单的测试用例,用于测试动态代理的基本功能:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyTest {
    public static void main(String[] args) {
        TargetObject targetObject = new TargetObject();
        targetObject.print();

        InvocationHandler invocationHandler = new MyInvocationHandler(targetObject);
        TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(TargetInterface.class.getClassLoader(), new Class[]{TargetInterface.class}, invocationHandler);
        proxy.print();
    }
}

interface TargetInterface {
    void print();
}

class TargetObject implements TargetInterface {
    @Override
    public void print() {
        System.out.println("Hello, world!");
    }
}

class MyInvocationHandler implements InvocationHandler {
    private final Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before invoke");
        Object result = method.invoke(target, args);
        System.out.println("After invoke");
        return result;
    }
}

全文小结

本文介绍了Java中的动态代理技术,包括基本原理、源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。动态代理是Java中一项重要的特性,可以在运行时动态生成代理对象,代替手动编写代理类的繁杂工作。动态代理常常和反射机制结合使用,通过反射机制获取代理对象的信息,将代理对象和目标对象进行绑定,然后在调用代理方法时,实际上是调用了绑定的目标对象的方法。

总结

动态代理是一项非常重要的Java技术,可以提高代码的重用性和可维护性。通过动态代理,可以在运行时动态生成代理对象。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。