1

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

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

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

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

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

我尝试了什么:

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

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

但两者都不起作用。

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

问候迈克尔

4

1 回答 1

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)

于 2010-07-19T17:10:41.933 回答