Java 匿名内部类如何实现动态代理?

2024年 4月 30日 62.8k 0

java 中可以使用匿名内部类实现动态代理,通过以下步骤:1. 定义接口;2. 创建实现 invocationhandler 接口的匿名内部类;3. 使用 proxy 类创建代理对象;4. 调用代理方法。实战中,动态代理可以增强或拦截方法调用,如记录方法执行时间。

Java 匿名内部类如何实现动态代理?

Java 匿名内部类如何实现动态代理

动态代理是一种用于在运行时创建对象代理的技术,允许在不修改目标类代码的情况下增强或拦截对象的调用。Java 中可以使用匿名内部类来实现动态代理。

1. 定义接口

首先,定义一个接口来表示目标对象的方法:

interface Target {
    void doSomething();
}

2. 创建匿名内部类

要创建动态代理,可以使用匿名内部类实现 InvocationHandler 接口:

InvocationHandler handler = new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 增强或拦截方法调用
        return 1;
    }
};

3. 创建代理对象

接下来,使用 Proxy 类创建代理对象:

Target proxy = (Target) Proxy.newProxyInstance(Target.class.getClassLoader(),
        new Class[]{Target.class}, handler);

4. 调用代理方法

现在可以调用代理对象上的方法,从而触发动态代理行为:

proxy.doSomething(); // 调用代理方法

实战案例

以下是一个使用匿名内部类实现动态代理的简单示例:

public class Main {
    public static void main(String[] args) {
        Target target = new TargetImpl();
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 增强方法调用
                long startTime = System.nanoTime();
                Object result = method.invoke(target, args);
                long endTime = System.nanoTime();
                System.out.println("方法执行时间:" + (endTime - startTime) + " 纳秒");
                return result;
            }
        };
        Target proxy = (Target) Proxy.newProxyInstance(Target.class.getClassLoader(),
                new Class[]{Target.class}, handler);
        proxy.doSomething();
    }
}

interface Target {
    void doSomething();
}

class TargetImpl implements Target {
    @Override
    public void doSomething() {
        System.out.println("原始方法执行");
    }
}

在此示例中,动态代理充当 Target 接口的代理,在调用原始方法之前和之后,它执行计时增强。

以上就是Java 匿名内部类如何实现动态代理?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论