我需要拦截对接口的所有方法调用的调用。我已经使用了 Java 动态代理,但这对我没有帮助。我什至不确定这是否可以实现,但想确认一下。
所以基本上可以说我有一个如下界面:
public interface Foo {
public String getValue();
}
我想拦截来自 Foo 的任何实现对 getValue() 的所有调用。问题是我无法控制 Foo 的不同实现,因此我无法使用动态代理。
有没有办法我可以做到这一点?
谢谢。
我需要拦截对接口的所有方法调用的调用。我已经使用了 Java 动态代理,但这对我没有帮助。我什至不确定这是否可以实现,但想确认一下。
所以基本上可以说我有一个如下界面:
public interface Foo {
public String getValue();
}
我想拦截来自 Foo 的任何实现对 getValue() 的所有调用。问题是我无法控制 Foo 的不同实现,因此我无法使用动态代理。
有没有办法我可以做到这一点?
谢谢。
做到这一点的唯一方法是使用自定义类加载器,用代理替换实现类。
使用Spring AOP的加载时编织可以开箱即用地做到这一点。
AOP 可能会有所帮助,但正如您所发现的,如果您能够控制对象的创建(即使只是通过像 Spring 或 Guice 这样的 DI 框架),这一切都会变得容易得多。
另一种选择是编译时字节码编织 - 也就是说,查找所有实现并更改它们以在编译时将拦截代码包含在其中。
第三种选择是在将类加载到系统中时使用代理或自定义类加载器进行编织。这是加载时编织。但是,如果你在一个 Web 容器中,你不能完全负责类加载器,这可能会很棘手。