首页 > 编程语言 >Java动态代理与方法拦截实战解析

Java动态代理与方法拦截实战解析

时间:2024-08-12 08:55:27浏览次数:8  
标签:after Java Object public call 拦截 解析 method before

Java动态代理与方法拦截实战解析

在Java编程中,动态代理是一种强大的技术,它允许我们在运行时创建接口的代理实例,并且可以拦截方法调用。本文将通过一个具体的实例,详细解析如何使用JDK的动态代理机制来实现方法拦截,以及如何编写通用的方法拦截器。

实现InvocationHandler

首先,我们需要实现InvocationHandler接口,这个接口定义了invoke方法,用于拦截所有代理对象的方法调用。下面是一个简单的实现示例:

public class MyInvocationHandler implements InvocationHandler {
    private String theString;

    public MyInvocationHandler(String theString) {
        this.theString = theString;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before method call : " + method.getName());
        Object result = method.invoke(theString, args);
        System.out.println("after method call : " + method.getName());
        return result;
    }
}

创建并代理String对象

为了演示基本的概念,我们选择了java.lang.CharSequence接口和它的实现类String。下面是如何将原始的String对象链接到它的代理CharSequence接口:

public static void main(String[] args) {
    MyInvocationHandler handler = new MyInvocationHandler("the example string");
    CharSequence o = (CharSequence) Proxy.newProxyInstance(
            MyInvocationHandler.class.getClassLoader(),
            new Class[]{CharSequence.class}, handler);

    System.out.println(o.length());
    System.out.println(o.subSequence(4, 8));
}

输出

before method call : length
after method call : length
18
before method call : subSequence
after method call : subSequence
exam

通用方法拦截器

接下来,我们将重写上面的拦截器,使其能够适用于任何对象:

public class MyInterceptor<T> implements InvocationHandler {
    private T t;

    public MyInterceptor(T t) {
        this.t = t;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before method call : " + method.getName());
        Object result = method.invoke(t, args);
        System.out.println("after method call : " + method.getName());
        return result;
    }

    @SuppressWarnings("unchecked")
    public static <T> T getProxy(T t, Class<? super T> interfaceType) {
        MyInterceptor handler = new MyInterceptor(t);
        return (T) Proxy.newProxyInstance(interfaceType.getClassLoader(),
                new Class<?>[]{interfaceType}, handler);
    }
}

public class MyInterceptorExample {
    public static void main(String[] args) {
        List<String> list = MyInterceptor.getProxy(new ArrayList<>(), List.class);
        list.add("one");
        list.add("two");
        System.out.println(list);
        list.remove("one");
    }
}

输出

before method call : add
after method call : add
before method call : add
after method call : add
before method call : toString
after method call : toString
[one, two]
before method call : remove
after method call : remove

示例项目

本示例项目使用了以下依赖和技术:

  • JDK 1.8
  • Maven 3.0.4

通过这个示例,我们可以看到动态代理如何在Java中实现AOP风格的’around advice’,以及如何通过InvocationHandler来拦截和处理方法调用。希望这个实战解析能够帮助你更好地理解和使用Java的动态代理技术。

标签:after,Java,Object,public,call,拦截,解析,method,before
From: https://blog.csdn.net/m0_62153576/article/details/141116827

相关文章

  • 深入解析@JsonValue注解在Java序列化中的应用
    深入解析@JsonValue注解在Java序列化中的应用在Java开发中,对象序列化是一个常见的需求,尤其是在进行网络通信或者数据持久化时。Jackson库作为Java领域内一个非常流行的JSON处理库,提供了强大的序列化和反序列化功能。在Jackson2.9版本之后,@JsonValue注解的引入,为开发者提供......
  • 【Java数据结构】---泛型
    乐观学习,乐观生活,才能不断前进啊!!!我的主页:optimistic_chen我的专栏:c语言,Java欢迎大家访问~创作不易,大佬们点赞鼓励下吧~文章目录包装类装箱和拆箱泛型泛型语法擦除机制泛型的上届泛型方法静态泛型方法完结包装类在Java中,由于基本类型不是继承自Objec......
  • Python数据科学的秘密武器:Pandas库的深度解析
    标题:Python数据科学的秘密武器:Pandas库的深度解析Python作为数据科学领域的宠儿,其强大的数据处理能力离不开Pandas库的加持。Pandas是一个开源的数据分析和操作库,它提供了快速、灵活和表达力强的数据结构,旨在使数据清洗和分析工作变得更加简单易行。本文将深入探讨Pandas库......
  • 云中韧性:Spring Cloud服务调用重试机制深度解析
    标题:云中韧性:SpringCloud服务调用重试机制深度解析在微服务架构中,服务间的调用可能会因为网络问题、服务不可达、资源竞争等原因失败。SpringCloud作为微服务架构的主流实现框架,提供了一套完整的服务调用重试机制,以增强系统的健壮性和可靠性。本文将详细探讨SpringCloud......
  • LangChain 安全特性全解析与实践指南
    LangChain安全特性全解析与实践指南引言在人工智能的浪潮中,LangChain以其卓越的能力,成为开发大型语言模型(LLM)应用程序的佼佼者。然而,随着技术的发展,安全问题逐渐浮出水面。本文将深入探讨LangChain的安全特性,并提供详细的代码示例和最佳实践,以确保开发者能够在保障安全......
  • 方法的调用(JAVA)
    方法之间允许相互调用,不需要知道方法的具体的实现,实现重用,提高效率。 1.静态方法用静态方法        用静态方法时通过类名.方法名的方法进行调用,当在同一类中时,直接通过方法名进行调用。2.静态方法调用非静态方法        同一个类中,通过对象来调用。 ......
  • 基于Java的考试信息报名系统 SpringBoot考试报名管理系统 Vue前后端分离【Java毕业设
    ⛄博主介绍:⚡全栈开发工程师,精通Web前后端技术、数据库、架构设计。专注于Java技术领域和小程序领域的开发,毕业设计、课程设计项目中主要包括定制化开发、源代码、代码讲解、文档报告辅导、安装调试等。✅文末获取联系✅目录1项目介绍 2技术选型 3系统总体设计 4......
  • 对象数组(JAVA)
    例:定义包含3个元素的对象数组,数据类型为Person,并用for遍历输出Person类publicclassPerson{publicintage;publicStringname;publicPerson(intage,Stringname){this.age=age;this.name=name;}}Test类publicclassTe......
  • 冒泡排序(JAVA)
    冒泡排序的过程排序次数是外层循环(5-1)交换次数是内层循环(5-i-1)importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intarr[]=newint[5];inttemp;System.out.println("请输入5名学生的成绩......
  • 解密AI的未来:决策式AI与生成式AI的深度解析
    在当今科技飞速发展的时代,人工智能(AI)已成为各行各业的热议话题。尤其是决策式AI和生成式AI,这两种技术各具特色,却又相辅相成。本文将深入探讨这两种AI的定义、应用及其未来发展趋势,带你一探究竟!一、什么是决策式AI?决策式AI是指能够通过分析数据和信息,帮助用户做出明智决策的人......