2012-03-30 292 views
1

我需要拦截对接口的所有方法调用的调用。我已经浏览了Java Dynamic Proxies,但是这对我无能为力。我甚至不确定这是否可以实现,但想到确认。Java拦截对接口的调用方法

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

public interface Foo {   
    public String getValue(); 
} 

我想从富取其实现拦截所有的getValue()调用。问题是我不能控制Foo的不同实现,因为我不能使用Dynamic Proxies。

有没有办法可以做到这一点?

谢谢。

+0

也许如果您使用Abstract.class而不是Interface,您将能够实现由每个子getValue() – 2012-03-30 11:43:37

回答

1

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

另一种替代方法是编译时字节码编织 - 即查找所有实现并更改它们以在编译时在其中编写拦截代码。

第三种方法是在类加载到系统中时使用代理或自定义类加载器来编织。这是加载时织造。但是,如果你在一个Web容器中,你不能完全掌控类加载器,这可能会很棘手。

1

要做到这一点的唯一方法是使用自定义类加载器,它用代理替换实现类。

可能有可能通过Spring AOP的加载时编织方式进行此开箱即用的操作。

+0

所调用的私有方法感谢您的回复。这一切看起来太复杂了,我的琐碎的想法。有一个更简单的例子,你可以指向我。 – user320550 2012-03-30 12:19:44