在ASPECT中的方法中访问业务方法的局部变量

时间:2011-04-02 08:27:54

标签: aspectj spring-aop

我想从业务类中的方法访问局部变量,方法是在方面类中。例如

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方法签名的情况下完成?

提前多多谢谢!

2 个答案:

答案 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,并且对局部变量的引用不是其中之一。)如果将“内部”方法设为私有或包私有,则甚至不会更改方法的通常理解的签名(因为外部代码将无法依赖于引入的方法。)