AfterAdvice为静态实现接口的类的所有构造函数

时间:2010-07-15 16:34:57

标签: java aspectj

我想对域对象进行一些授权检查。这包括检查是否允许某人实例化一个对象(取决于它的类型 - 这项检查是在外部完成的,所以不需要解决这个问题。)

我们所有的域对象都实现了一个特定的接口(直接或间接)

我需要的是一个在域对象实例化后运行的建议,并且能够使用创建的实例(确定权限所需)。 (另外,当构造函数从hibernate中调用时,建议可能不会执行)

我想使用AspectJ(它正在为方法工作)实现这一点,理想情况下只使用静态分析,因为没有运行时相关的更改

现在我正在尝试创建一个拦截构造函数调用的@AfterReturning adivce。但我没有得到切入点。

我尝试了什么:

@Pointcut("within(a.b.c.DomainObject+) && execution(*.new(..))")

@Pointcut("execution(a.b.c.DomainObject+.new(..))")

但两者都不起作用。

有谁知道我怎么做到这一点?

问候迈克尔

1 个答案:

答案 0 :(得分:0)

以下是一些帮助我弄清楚如何做类似事情的例子。 http://www.eclipse.org/aspectj/sample-code.html

此外,我的项目中有一些内容 - 出于测试目的 - 在创建对象后添加侦听器:

pointcut init(JComponent j):
    this(j) &&
    initialization(*.new());

after(JComponent j) returning: init(j) {
    if(j instanceof JButton && !(j instanceof AccessibleButton))
        System.out.println(j.toString() + thisJoinPointStaticPart.getSourceLocation());
    j.addFocusListener(new VisualFocusListener());
}

修改

每次调用构造函数时都会执行上述操作,无论是this()还是super()调用或调用的构造函数 - 可能不是您想要的。我刚刚想出了另一种方法来获取构造函数返回的对象。

after() returning(JComponent j): call(*.new(..)) {
    //do something with j
}

用英语阅读几乎就像在代码中一样:“从构造函数返回一个JComponent后,做一些事情”。我有*.new(..)因为我不关心调用哪个构造函数或者只要它给我一个JComponent所需的参数。您可以通过说出Foo.new(..)Foo.new(int)来进一步限制。