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

lup*_*oem 7 aspectj spring-aop

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

class BusinessClass {
    public void simpleTest() {
        ...
        String localString = new String( "test" );
        ...
    }
} 

MyAspect {
    log() {
        // I WANT TO ACCESS THE VALUE OF LOCALSTRING HERE
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在MyAspect的log方法中访问localString的值.如果有任何方法可以使用Spring/AspectJ完成此操作,请告诉我.另外,有没有办法在不改变simpleTest方法签名的情况下完成?

非常感谢!

And*_*erg 18

遗憾的是,局部变量不会通过连接点公开.这意味着您无法编写切入点来匹配它们.所以,答案是否定的,你不能直接这样做.

但是,如果您要重构代码以便在方法内部创建局部变量,那么您可以访问它.

从概念上讲,这种重构可能对您的代码更好.您可以通过将其封装在命名良好的方法中,明确分配正在执行的操作,而不是简单地分配新的局部变量.

例如,这个:

String localString = new String( "test" );
Run Code Online (Sandbox Code Playgroud)

成为这个:

String localString = allocateTestString();  // or some better name
Run Code Online (Sandbox Code Playgroud)

用这种方法:

private String allocateTestString() { 
    return new String( "test" )
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写一个切入点以这种方式捕获局部变量:

after() returning(String var) : call(private String allocateTestString()) {
     // do something fun
}
Run Code Online (Sandbox Code Playgroud)


Don*_*ows 7

据我了解,方面旨在适用于许多方法(由切入点定义).因此,他们没有看到方法的内部:只是方法的参数和它的结果.这意味着,你想要什么不能做直接,但你可以尝试重构你的方法分为两个部分,一个是取localString作为参数,并应用默认值,它的其他.这将为您提供一个方便的连接点.(AspectJ引用列出了连接点,对局部变量的引用不是其中之一.)如果将"内部"方法设为私有或包私有,则甚至不会更改方法的通常理解的签名(因为外部代码将无法依赖于引入的方法).

  • 还要注意,Spring AOP仅支持AspectJ的子集。 (3认同)