首页 >Java >java教程 >Java 匿名内部类如何实现动态代理?

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

WBOY
WBOY原创
2024-04-30 17:36:01961浏览

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 匿名内部类如何实现动态代理?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn