JAVA的动态代理详解

这篇具有很好参考价值的文章主要介绍了JAVA的动态代理详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

动态代理提供了一种灵活且非侵入式的方式,可以对对象的行为进行定制和扩展。它在代码重用、解耦和业务逻辑分离、性能优化以及系统架构中起到了重要的作用。

增强对象的功能:通过动态代理,可以在不修改原始对象的情况下,对其方法进行增强或添加额外的行为。可以在方法执行前后进行一些操作,比如日志记录、性能监测、事务管理等。

解耦和业务逻辑分离:动态代理可以将对象的特定操作从业务逻辑中解耦,使得代码更加模块化和可维护。代理对象可以负责处理一些通用的横切关注点,而业务对象可以专注于核心业务逻辑。

实现懒加载:通过动态代理,可以延迟加载对象,只有在真正需要使用对象时才会进行创建和初始化,从而提高性能和资源利用效率。

实现远程方法调用:动态代理可以用于实现远程方法调用(RPC)和分布式系统中的服务代理。客户端通过代理对象调用远程服务,并隐藏了底层网络通信的细节。

实现AOP编程:动态代理是实现面向切面编程(AOP)的基础。通过代理对象,可以将横切关注点(如日志、事务、安全性)与业务逻辑进行解耦,提供更高层次的模块化和可重用性。


一、动态是什么?

动态代理是一种设计模式,它允许在运行时创建代理对象,并将方法调用重定向到不同的实际对象。它使我们能够在不修改现有代码的情况下增加或改变某个对象的行为。

二、使用步骤

1.导入相应的包

在Java中,可以使用Java的反射机制来实现动态代理。Java提供了java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。

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

2.定义接口

// 定义接口
interface UserService {
    void addUser(String username);
}

3.定义接口实现类

// 实现接口的具体类
class UserServiceImpl implements UserService {
    public void addUser(String username) {
        System.out.println("添加用户:" + username);
    }
}

4.实现InvocationHandler接口

// 实现InvocationHandler接口
class MyInvocationHandler implements InvocationHandler {
	// 声明一个私有变量
    private Object target;

	// 构造函数
    public MyInvocationHandler(Object target) {
        this.target = target;
    }

	//  实现InvocationHandler接口的invoke方法,该方法在代理对象调用方法时被触发。
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("动态代理前置操作");
        Object result = method.invoke(target, args);
        System.out.println("动态代理后置操作");
        return result;
    }
}

这段代码实现了InvocationHandler接口,它是实现动态代理的关键部分。

5.实现代理

public class DynamicProxyExample {
    public static void main(String[] args) {
        // 创建目标对象
        UserService userService = new UserServiceImpl();

        // 创建InvocationHandler实例
        MyInvocationHandler handler = new MyInvocationHandler(userService);

        // 创建动态代理对象
        UserService proxy = (UserService) Proxy.newProxyInstance(
                userService.getClass().getClassLoader(),
                userService.getClass().getInterfaces(),
                handler
        );

        // 通过代理对象调用方法
        proxy.addUser("Alice");
    }
}

三、整体实例

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

// 定义接口
interface UserService {
    void addUser(String username);
}

// 实现接口的具体类
class UserServiceImpl implements UserService {
    public void addUser(String username) {
        System.out.println("添加用户:" + username);
    }
}

// 实现InvocationHandler接口
class MyInvocationHandler implements InvocationHandler {
    private Object target;

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

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("动态代理前置操作");
        Object result = method.invoke(target, args);
        System.out.println("动态代理后置操作");
        return result;
    }
}

public class DynamicProxyExample {
    public static void main(String[] args) {
        // 创建目标对象
        UserService userService = new UserServiceImpl();

        // 创建InvocationHandler实例
        MyInvocationHandler handler = new MyInvocationHandler(userService);

        // 创建动态代理对象
        UserService proxy = (UserService) Proxy.newProxyInstance(
                userService.getClass().getClassLoader(),
                userService.getClass().getInterfaces(),
                handler
        );

        // 通过代理对象调用方法
        proxy.addUser("Alice");
    }
}

四、输出结果

动态代理前置操作
添加用户:Alice
动态代理后置操作

总结

动态代理在许多地方都有用处,比如日志记录、性能监测、权限验证等。这种动态代理的设计模式使得我们能够以一种非侵入式的方式对对象的行为进行定制和扩展,提供了更高的灵活性和可维护性。文章来源地址https://www.toymoban.com/news/detail-667119.html

到了这里,关于JAVA的动态代理详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java中的静态代理、jdk动态代理以及CGLIB 动态代理

    代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能 那以下文章主要谈三种代理模式, 分别是静态代理,jdk的动态代理,cglib的动

    2024年02月11日
    浏览(44)
  • java基础之Java的动态代理如何实现

    目录 Java实现动态代理的两种方式 两种动态代理的区别 JDK 的动态代理是基于接口的代理。 CGLIB 是基于继承的代理。 总结 补充 静态代理和动态代理的区别 动态代理的用途 Spring AOP的实现方式 JDK 动态代理代码示例 Cglib动态代理代码示例 JDK动态代理 :Java.lang.reflect 包中的Pr

    2024年02月03日
    浏览(39)
  • 【Java学习笔记】 动态代理

    1、什么是动态代理? 前面已经提到了,动态代理就是【在内存】中动态生成【字节码代理类】的技术。(虽然不需要开发者书写,但是在内存层面依然存在该代理对象】 优点 : 减少了代理类的数量 并且解决了代码复用的问题。 动态代理常见的实现技术包括以下三种 JDK内

    2024年02月04日
    浏览(39)
  • Java——JDK动态代理

    动态代理(理解) 基于反射机制 举个例子,生活中一般在打官司的时候都会请代理律师,为什么要请律师呢?是因为开庭的时候大部人对于打官司没有经验,只会说出自己案件的陈述,并不会根据法律等争取自己权益的最大化,此时就可以请律师帮助自己不仅完成对案件的陈述

    2024年02月09日
    浏览(43)
  • Java动态代理、反射

    动态代理就是无侵入式的给代码增加新的功能,通过接口保证后面的对象和代理需要实现同一个接口,接口中就是被代理的所有方法,代理里面就是对象要被代理的方法。 因为一个对象觉得自己身上的功能太多,就会将一部分功能代理出去,对象中什么方法想要被代理,在代

    2024年02月11日
    浏览(50)
  • Java反射和动态代理

    反射允许对封装类的成员变量、成员方法和构造方法的信息进行编程访问 成员变量:修饰符、名字、类型、get/set值 构造方法:修饰符、名字、形参、创建对象 成员方法:修饰符、名字、形参、返回值、抛出的异常、获取注解、运行方法 获取class对象 Class.forName(“全类名”

    2024年02月03日
    浏览(56)
  • Java中的动态代理

    Java中常用的有两种动态代理方式,分别为:JDK动态代理和Cglib动态代理。 JDK动态代理是通过实现接口的方式完成动态代理。 Cglib动态代理是通过继承目标类或实现接口的方式完成动态代理。 JDK动态代理中最核心的就是Proxy类和InvocationHandler接口。 通过调用这个类中的静态方法

    2024年02月16日
    浏览(41)
  • Java动态代理

    我们可以把姬哥看成对象,那么他就会有唱,跳的方法。Java的动态代理就像中介,负责给他收钱的,以及之后维护的功能(也就是增强的功能)。当有人来找的时候,代理通过实现包含唱跳的方法的接口,

    2024年02月20日
    浏览(41)
  • Java中的代理模式(二)JDK动态代理

    大家好👋,我是极客涛😎,上一篇中我们对代理模式有两大类,静态代理和动态代理,对于静态代理相信大家都信手拈来。对于动态代理还有两种实现,一种是java原生的Jdk代理,一种是Cglib方式。因为涉及到源码解读,所以我也将分两期完成,本期主要讲讲JDK动态代理的实

    2024年01月22日
    浏览(42)
  • Java代理之jdk动态代理+应用场景实战

    本文将先介绍jdk动态代理的基本用法,并对其原理和注意事项予以说明。之后将以两个最常见的应用场景为例,进行代码实操。这两个应用场景分别是 拦截器 和 声明性接口 ,它们在许多开发框架中广泛使用。比如在spring和mybatis中均使用了拦截器模式,在mybatis中还利用动态

    2023年04月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包