在没有AOP的情况下拦截带注释的方法调用

时间:2011-09-23 12:18:44

标签: java annotations method-call

是否可以在不使用任何AOP框架(如AspectJ,Spring AOP,Guice等)的情况下拦截使用自定义注释注释的方法的执行...我很想知道是否有任何默认值java apis可用于此目的(例如Reflection)。

感谢。

3 个答案:

答案 0 :(得分:1)

如果不挂钩,例如,实例化逻辑,则无法直接拦截现有方法的方法调用。一种方法是将实例化逻辑分成工厂,该工厂可以使用例如Proxy

public class FooFactry() {
     private InvocationHandler handler;

     public FooFactory(InvocationHandler handler) {
         this.handler = handler;
     }

     public Foo newInstance() {
        return (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                              new Class[] { Foo.class },
                              handler);
     }
}

您可以使用自定义InvocationHandler拦截Foo上发布的任何方法。您还可以创建自己的包装器以避免动态代理class FooWrapper extends Foo{}来实现相同的结果。

答案 1 :(得分:0)

使用反射无法完成,因为它不提供对执行的任何控制。但是你可以写自己的agent。您需要使用BCEL之类的工具来更轻松。它与Java框架和Kosher非常相似。

答案 2 :(得分:0)

您可以使用反射来调用方法,但不能使用它来拦截方法调用。同样,您可以使用Proxy类创建具有动态调用处理程序的代理,但不能拦截不以代理为目标的现有代码。

所以答案是否定的。