Java动态代理

Java动态代理是一种强大的机制,允许你在运行时创建一个实现了一组给定接口的代理类的实例。这个代理类可以用来拦截对原始对象的方法调用,执行额外的操作,比如日志记录、性能监控、事务处理等。下面是一个简单的Java动态代理的例子:

定义接口

首先,定义一个接口,代理类将实现这个接口的方法。

java 复制代码
public interface MyInterface {
    void performAction();
}

实现类

然后,创建一个实现此接口的类:

java 复制代码
public class MyInterfaceImpl implements MyInterface {
    @Override
    public void performAction() {
        System.out.println("Performing action in the original class");
    }
}

创建代理类

接下来,创建一个实现InvocationHandler接口的类,用于定义方法调用的处理逻辑:

java 复制代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {
    private final MyInterface originalObject;

    public MyInvocationHandler(MyInterface originalObject) {
        this.originalObject = originalObject;
    }

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

使用动态代理

最后,使用Proxy类创建代理实例并使用它:

java 复制代码
import java.lang.reflect.Proxy;

public class ProxyExample {
    public static void main(String[] args) {
        MyInterface original = new MyInterfaceImpl();
        MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
            MyInterface.class.getClassLoader(),
            new Class[]{MyInterface.class},
            new MyInvocationHandler(original));

        proxy.performAction();
    }
}

在这个例子中,当你调用proxy.performAction()方法时,它会先打印"Before invoking performAction",然后调用原始对象的performAction方法,最后打印"After invoking performAction"。这就是动态代理的基本用法,可以根据需要在调用原始方法之前或之后添加自定义的行为。

相关推荐
0白露4 分钟前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.1 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐1 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
战族狼魂2 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
Tttian6223 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
xyliiiiiL3 小时前
ZGC初步了解
java·jvm·算法
杉之3 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
hycccccch3 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
独好紫罗兰4 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
天天向上杰5 小时前
面基JavaEE银行金融业务逻辑层处理金融数据类型BigDecimal
java·bigdecimal