执行一个方法,当该类中的任何其他方法被调用时,然后是Aspect

时间:2015-08-20 20:11:12

标签: java

我正在寻找一个方法被执行的java实现,当该类中的任何其他方法被调用时,其他方面(像@before对Junits所做的那样)

我不喜欢使用JAspect。 (仅仅因为我不想拥有一个Spring配置文件,如果没有Spring XML配置就可以了)

简单示例

public class Reader {

    private void init(){}

    private void method1(){}

    private void method2(){}

}

这里每次调用method1或method2时,都必须调用init()。

  1. 我对在该方法中调用init()不感兴趣。
  2. 我对使用Aspect with XML config不感兴趣。
  3. 提前致谢

2 个答案:

答案 0 :(得分:2)

您可以尝试使用Javassist调整您的实施。你可以找到一个很好的介绍here。以下代码片段取自教程(略微适应),并展示了如何操作字节码以插入其他命令:

public class Hello {
    public void say() {
        System.out.println("Hello");
    }

    public void ask() {
        System.out.println("HM?");
    }
}

public class Test {
    public static void main(String[] args) throws Exception {
        ClassPool cp = ClassPool.getDefault();
        CtClass cc = cp.get("Hello");
        CtMethod m = cc.getDeclaredMethod("say");
        m.insertBefore("{ ask(); }");
        Class c = cc.toClass();
        Hello h = (Hello)c.newInstance();
        h.say();
    }
}

答案 1 :(得分:1)

你应该看看代理模式。

JAVA已经提供了这种机制。它被称为动态代理。

看看这个:http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html

或者搜索" JAVA动态代理"。你会发现很多资源。

一些理论:有三种可能的做法:

  1. 方面方向(您不想)
  2. 模板方法 - 模式(您不想)
  3. 代理模式(唯一剩下的)