繁体   English   中英

执行一个方法时,当该类中的任何其他方法称为“其他”而不是“外观”时

[英]Executing a method, when any other method in that class is called other then Aspect

我正在寻找一个方法被执行的Java实现,当该类中的任何其他方法都称为Aspect之后(类似于@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与XML配置一起使用不感兴趣。

提前致谢

您可以尝试使用Javassist调整实现。 您可以在这里找到很好的介绍。 以下代码段摘自该教程(略有改编),并显示了如何操作字节码以插入其他命令:

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();
    }
}

您应该看一下代理模式。

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

检查一下: http : //tutorials.jenkov.com/java-reflection/dynamic-proxies.html

或搜索“ JAVA动态代理”。 您会发现大量的资源。

一些理论:您可以根据需要执行三种操作:

  1. 外观方向(您不想)
  2. 模板方法-模式(您不想)
  3. 代理模式(仅剩一种)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM