2015-08-20 46 views
2

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

我不喜欢使用JAspect。 (只是因为我不想有一个Spring配置文件,如果它可能没有一个Spring XML配置)

简单的例子

public class Reader { 

    private void init(){} 

    private void method1(){} 

    private void method2(){} 

} 

这里每次方法1或方法2被调用,它必须调用的init( )。

  1. 我不想在该方法内调用init()。
  2. 我不想在XML配置中使用Aspect。

在此先感谢

回答

2

您可以尝试使用​​,以适应您的实现。你可以找到一个很好的介绍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

你应该看看代理模式。

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

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

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

一些理论认为:有三种可能,你希望做的:

  1. 纵横方向(你不想)
  2. 模板方法,模式(你不想)
  3. 代理图案(唯一一个)
相关问题