Доступ к локальной переменной бизнес-метода в методе, который находится в ASPECT - PullRequest
7 голосов
/ 02 апреля 2011

Я хочу получить доступ к локальной переменной из метода в бизнес-классе, в методе, который находится в классе аспекта. Например

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

MyAspect {
    log() {
        // I WANT TO ACCESS THE VALUE OF LOCALSTRING HERE
    }
}

Я хочу получить доступ к значению localString в методе журнала MyAspect. Пожалуйста, дайте мне знать, если есть какой-либо способ сделать это с помощью Spring / AspectJ. Кроме того, есть ли способ выполнить без изменения сигнатуры метода simpleTest?

Большое спасибо заранее!

Ответы [ 2 ]

18 голосов
/ 03 апреля 2011

К сожалению, локальные переменные не предоставляются через точки соединения.Это означает, что вы не можете написать pointcut, чтобы соответствовать им.Таким образом, ответ - нет, вы не можете сделать это напрямую.

Однако, если бы вы должны были реорганизовать свой код так, чтобы локальная переменная была создана внутри метода, вы могли бы получить к нему доступ.

Концептуально этот вид рефакторинга может быть лучше для вашего кода.Вместо того, чтобы просто выделять новую локальную переменную, вы можете четко указать, что делает выделение, инкапсулировав ее в метод с хорошо известным именем.

Например, это:

String localString = new String( "test" );

становитсяthis:

String localString = allocateTestString();  // or some better name

С помощью этого метода:

private String allocateTestString() { 
    return new String( "test" )
}

Затем вы можете написать pointcut для захвата локальной переменной следующим образом:

after() returning(String var) : call(private String allocateTestString()) {
     // do something fun
}
7 голосов
/ 02 апреля 2011

Как я понимаю, аспекты предназначены для применения ко многим методам (как определено pointcut).Таким образом, они не видят внутреннюю часть метода: только аргументы метода и его результат.Это означает, что то, что вы хотите, не может быть сделано напрямую , но вы можете попробовать реорганизовать ваш метод на две части, одна из которых принимает localString в качестве аргумента, а другая применяет значение по умолчаниюЭто.Это даст вам удобную точку соединения.(Справочные списки AspectJ объединяют точки соединения , и ссылки на локальные переменные не являются одними из них.) Если вы сделаете «внутренний» метод закрытым или закрытым для пакета, вы даже не измените общийпонятная сигнатура метода (поскольку внешний код не сможет зависеть от введенного метода).

...