Java拦截对接口方法的调用

时间:2012-03-30 11:38:20

标签: java intercept dynamic-proxy

我需要拦截对接口的所有方法调用的调用。我已经浏览了Java动态代理,但这对我没有帮助。我甚至不确定这是否可以实现,但想到确认。

所以基本上我可以说我有一个如下界面:

public interface Foo {        
   public String getValue();
}

我想从Foo的任何实现中拦截对getValue()的所有调用。问题是我无法控制Foo的不同实现,因为我无法使用Dynamic Proxies。

我有办法做到这一点吗?

感谢。

2 个答案:

答案 0 :(得分:1)

执行此操作的唯一方法是使用自定义类加载器,用代理替换实现类。

可能可以通过Spring AOP的加载时编织来实现这一目标。

答案 1 :(得分:1)

AOP可能会有所帮助,但正如您所发现的,如果您控制对象创建(即使只通过像Spring或Guice这样的DI框架),这一切都会变得更加容易。

另一种替代方法是编译时字节码编织 - 也就是说,找到所有实现并改变它们,以便在编译时将拦截代码包含在其中。

第三种方法是在将类加载到系统中时使用代理或自定义类加载器进行编织。这是装载时编织。但是,如果你在一个网络容器中,你没有完全负责类加载器,这可能会很棘手。