Java 中可以使用匿名内部类实现动态代理,通过以下步骤:1. 定义接口;2. 创建实现 InvocationHandler 接口的匿名内部类;3. 使用 Proxy 类创建代理对象;4. 调用代理方法。实战中,动态代理可以增强或拦截方法调用,如记录方法执行时间。
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中文网其他相关文章!