【问题标题】:Access a business method's local variable in a method which is in an ASPECT在 ASPECT 中的方法中访问业务方法的局部变量
【发布时间】:2011-04-02 08:27:53
【问题描述】:

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

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

非常感谢!

【问题讨论】:

    标签: aspectj spring-aop


    【解决方案1】:

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

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

    从概念上讲,这种重构可能更适合您的代码。除了简单地分配一个新的局部变量,您还可以通过将其封装在一个命名良好的方法中来明确分配的作用。

    例如,这个:

    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
    }
    

    【讨论】:

    • 虽然你的答案也是正确的,但还是在他第一个回答时投了多纳尔的票。再次感谢您的意见。
    【解决方案2】:

    据我了解,方面旨在适用于许多方法(由切入点定义)。因此,他们看不到方法的内部结构:只看到方法的参数和结果。这意味着您无法直接完成您想要的操作,但您可以尝试将您的方法重构为两部分,一个将localString 作为参数,另一个应用默认值给它。然后,这将为您提供一个方便的连接点。 (AspectJ reference lists join points 和对局部变量的引用不是其中之一。)如果您将“内部”方法设为私有或包私有,您甚至不会更改该方法的普遍理解签名(因为外部代码将无法依赖引入的方法)。

    【讨论】:

    • 还要注意 Spring AOP 只支持 AspectJ 的一个子集。
    • 1 表示子集提及。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2014-07-29
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多