Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

java动态代理详解

作者:浪子无家   发布日期:2025-12-22   浏览:42

// Java动态代理示例代码

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

// 定义一个接口
interface Service {
    void performTask();
}

// 实现该接口的类
classServiceImpl implements Service {
    @Override
    public void performTask() {
        System.out.println("Executing task inServiceImpl.");
    }
}

// 自定义InvocationHandler实现类
classServiceInvocationHandler implements InvocationHandler {
    private Object target;

    publicServiceInvocationHandler(Object target) {
        this.target = target;
    }

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

public class DynamicProxyExample {
    public static void main(String[] args) {
        // 创建目标对象
        Service serviceImpl = newServiceImpl();

        // 创建InvocationHandler
        ServiceInvocationHandler handler = newServiceInvocationHandler(serviceImpl);

        // 通过Proxy为指定接口创建动态代理实例
        Service proxyInstance = (Service) Proxy.newProxyInstance(
            serviceImpl.getClass().getClassLoader(),
            new Class[]{Service.class},
            handler
        );

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

解释说明:

  1. 接口定义Service 接口定义了一个 performTask 方法,这是我们要代理的目标方法。

  2. 实现类ServiceImpl 类实现了 Service 接口,并提供了一个具体实现。

  3. InvocationHandler 实现ServiceInvocationHandler 类实现了 InvocationHandler 接口。它负责在调用代理对象的方法时执行额外的逻辑(如日志记录)。invoke 方法会在每次调用代理对象的方法时被触发。

  4. 动态代理创建:在 DynamicProxyExample 类中,我们使用 Proxy.newProxyInstance 方法为 Service 接口创建一个动态代理实例。这个代理实例会拦截所有对 performTask 方法的调用,并通过 ServiceInvocationHandler 来处理这些调用。

  5. 调用代理对象的方法:最后,我们通过代理对象调用 performTask 方法,可以看到控制台输出了前置和后置的日志信息。

通过这种方式,Java 动态代理可以在不修改原有代码的情况下,灵活地添加额外的功能(如日志、事务管理等)。

上一篇:javaswing是什么意思

下一篇:java获取list某个字段的值

大家都在看

java url decode

java判断是windows还是linux

java连接数据库的代码

java date类型比较大小

java djl

ubuntu 卸载java

es java api

java读取excel中的图片

java新建

java base64 加密

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站