我想对域对象进行一些授权检查。这包括检查是否允许某人实例化一个对象(取决于它的类型 - 这项检查是在外部完成的,所以不需要解决这个问题。)
我们所有的域对象都实现了一个特定的接口(直接或间接)
我需要的是一个在域对象实例化后运行的建议,并且能够使用创建的实例(确定权限所需)。 (另外,当构造函数从hibernate中调用时,建议可能不会执行)
我想使用AspectJ(它正在为方法工作)实现这一点,理想情况下只使用静态分析,因为没有运行时相关的更改
现在我正在尝试创建一个拦截构造函数调用的@AfterReturning adivce。但我没有得到切入点。
我尝试了什么:
@Pointcut("within(a.b.c.DomainObject+) && execution(*.new(..))")
@Pointcut("execution(a.b.c.DomainObject+.new(..))")
但两者都不起作用。
有谁知道我怎么做到这一点?
问候迈克尔
答案 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)
来进一步限制。