我想从业务类中的方法访问局部变量,方法是在方面类中。例如
class BusinessClass {
public void simpleTest() {
...
String localString = new String( "test" );
...
}
}
MyAspect {
log() {
// I WANT TO ACCESS THE VALUE OF LOCALSTRING HERE
}
}
我想在MyAspect的log方法中访问localString的值。如果有任何方法可以使用Spring / AspectJ完成此操作,请告诉我。另外,有没有办法在不改变simpleTest方法签名的情况下完成?
提前多多谢谢!
答案 0 :(得分:18)
不幸的是,局部变量不会通过连接点公开。这意味着您无法编写切入点来匹配它们。所以,答案是否定的,你不能直接这样做。
但是,如果您要重构代码以便在方法内部创建局部变量,那么您可以访问它。
从概念上讲,这种重构可能对您的代码更好。您可以通过将其封装在命名良好的方法中来明确分配新的局部变量,而不是简单地分配新的局部变量。
例如,这个:
String localString = new String( "test" );
成为这个:
String localString = allocateTestString(); // or some better name
使用这种方法:
private String allocateTestString() {
return new String( "test" )
}
然后你可以写一个切入点以这种方式捕获局部变量:
after() returning(String var) : call(private String allocateTestString()) {
// do something fun
}
答案 1 :(得分:7)
据我了解,方面旨在适用于许多方法(由切入点定义)。因此,他们没有看到方法的内部:只是方法的参数和它的结果。这意味着你想要的东西不能直接完成,但你可以尝试将你的方法重构为两个部分,一部分以localString
为参数,另一部分用于默认值。这将为您提供一个方便的连接点。 (AspectJ reference lists join points,并且对局部变量的引用不是其中之一。)如果将“内部”方法设为私有或包私有,则甚至不会更改方法的通常理解的签名(因为外部代码将无法依赖于引入的方法。)