首页 > 编程语言 >Java 中实现动态代理

Java 中实现动态代理

时间:2024-09-13 18:22:04浏览次数:3  
标签:Java Object 代理 method InvocationHandler Proxy 动态 public

在 Java 中,动态代理(Dynamic Proxy)允许在运行时创建代理对象来处理方法调用,而不需要在编译时定义具体的实现类。Java 的 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口是实现动态代理的关键。

步骤:

  1. 创建接口:定义一个接口,代理对象将会实现这个接口。
  2. 创建实际类:创建接口的实际实现类。
  3. 实现 InvocationHandler:定义动态代理逻辑。
  4. 使用 Proxy.newProxyInstance:生成代理对象。

例子

  1. 定义接口
public interface MyService {
    void performAction();
}

2. 实现接口的实际类

public class MyServiceImpl implements MyService {
    @Override
    public void performAction() {
        System.out.println("Performing action in MyServiceImpl");
    }
}

3. 实现 InvocationHandler 来处理代理逻辑

InvocationHandlerinvoke 方法将在代理对象的方法被调用时执行。

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

public class MyInvocationHandler implements InvocationHandler {
    private 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 method call: " + method.getName());
        Object result = method.invoke(target, args);  // 调用实际的方法
        System.out.println("After method call: " + method.getName());
        return result;
    }
}

4. 使用 Proxy.newProxyInstance 创建代理对象

import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        // 创建实际对象
        MyService myService = new MyServiceImpl();
        
        // 创建 InvocationHandler
        MyInvocationHandler handler = new MyInvocationHandler(myService);
        
        // 创建代理对象
        MyService proxyInstance = (MyService) Proxy.newProxyInstance(
                myService.getClass().getClassLoader(),
                myService.getClass().getInterfaces(),
                handler
        );

        // 调用代理对象的方法
        proxyInstance.performAction();
    }
}

运行结果

Before method call: performAction
Performing action in MyServiceImpl
After method call: performAction

解释:

  • Proxy.newProxyInstance:该方法创建代理对象,传入的参数包括类加载器、接口和 InvocationHandler
  • InvocationHandler:处理代理对象的每个方法调用,通过 method.invoke(target, args) 调用实际对象的方法。
  • 代理对象可以在运行时动态拦截方法调用,方便实现功能扩展(如日志、事务处理等)。

使用场景:

  • AOP(面向切面编程)
  • 代理模式
  • 拦截器

标签:Java,Object,代理,method,InvocationHandler,Proxy,动态,public
From: https://blog.csdn.net/galoiszhou/article/details/142217585

相关文章

  • Java笔试面试题AI答之单元测试JUnit(4)
    文章目录19.简述JUnitorg.junit.TestSuite类的作用?1.组织测试类2.简化测试执行3.灵活配置测试环境4.嵌套测试套件注意事项20.在JUnit中@Test注释的作用和用法?作用用法21.简述Junit基础注解(@BeforeClass、@Before、@Test、@After、@AfterClass)?22.编写代......
  • java学习9.13
    将java测试卷重新完成,测试完后基本完成需求,无明显BUG结合课堂上去写这个java测试卷,总的来说,之前没有独立写过类似项目+限时是比较大的问题。如果之前没有经历类似的情况,很多功能都是第一次用,那么就会导致出现bug而不知道如何去改,并且加上时间限制,如果时间全花在改bug上,又无法完......
  • 《C++中动态数组的实现与探索》
    在C++编程中,动态数组是一种非常重要的数据结构,它能够根据实际需求在运行时动态地调整大小,为程序员提供了极大的灵活性。本文将深入探讨如何在C++中实现动态数组,包括使用内置数据结构和自定义实现的方法,同时分析其性能特点和应用场景。一、引言在编程过程中,我们经常会遇......
  • A-计算机毕业设计定制:93904 家庭健康管理系统(免费领源码)可做计算机毕业设计JAVA、PHP
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,家庭健康管理系统被用户普遍使用,为方便用户能够可以随时进行家庭健康管理系统的数据信息管理,特开发了SSM家庭健康管理系......
  • 2025最新:如何打造Java SpringBoot Vue房屋租赁管理系统?掌握房源管理,实现房东无忧!
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、微信小程序、大数据实战项目集⚡⚡文末......
  • 2025年JavaWeb技术打造社区老人健康管理系统,3步轻松设计与实现,建议收藏!
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、微信小程序、大数据实战项目集⚡⚡文末......
  • 基于Java中的SSM框架实现校园生活管理系统项目【项目源码+论文说明】计算机毕业设计
    基于java中的SSM框架实现校园生活管理系统演示【内附项目源码+LW说明】摘要随着现代化发展进程不断的加快,人们对于网络的接受程度越来越强,现在人们的生活与工作已经离不开网络的帮助。而网络在当下的学校中也已经非常的普及,现在各类学校的网络覆盖率已经接近于100%。基于......
  • Java 金额计算公共方法
    publicclassMathUtils{privatestaticfinalintDEF_DIV_SCALE=32;/***转为BigDecimal**@paramobj*/publicstaticBigDecimaltoBigDecimal(Objectobj){Stringstr=String.valueOf(obj);returnstrin......
  • 基于Java中的SSM框架实现校园招聘信息管理系统项目【项目源码+论文说明】计算机毕业设
    基于java中的SSM框架实现校园招聘信息管理系统平台演示【内附项目源码+LW说明】摘要随着我国近年来高校不断的进行扩招,2022年全国高校的毕业生人数已经超过一千万人,而在这个时代的大学生早已不像上世纪八九十年代一样,毕业就可以分配工作,所以在当今这个时代毕业生找工作是......
  • Java Script - Web Api
    变量声明有3个ver、let和const。建议const优先,其次为let。constarr=['red','pink']arr.push('blue')arr=[1,2,4]arr.push(5)//错误,arr为const1、WebApi基本认知1.1、作用和分类作用:就是使用j......