2013-02-21 4 views
0

Я использую aspectj для добавления некоторого поля в существующий класс и аннотации его также. Я использую время ткачества.Получить значения атрибутов класса с помощью aspectJ

Пример: - У меня есть клиент класса, в котором я добавляю 3 строковых атрибута. Но мои проблемы в том, что я должен установить некоторые значения и получить их еще до моего бизнес-вызова.

Я пытаюсь использовать подход ниже. В моем файле aj я добавил следующее: моя проблема заключается в том, что происходит вокруг pointcut, как мне получить атрибут и установить атрибут.

public String net.customers.PersonCustomer.getOfflineRiskCategory() { 
     return OfflineRiskCategory; 
} 

public void net.customers.PersonCustomer.setOfflineRiskCategory(String offlineRiskCategory) { 
     OfflineRiskCategory = offlineRiskCategory; 
    } 

    public String net.customers.PersonCustomer.getOnlineRiskCategory() { 
     return OnlineRiskCategory; 
    } 

    public void net.customers.PersonCustomer.setOnlineRiskCategory(String onlineRiskCategory) { 
     OnlineRiskCategory = onlineRiskCategory; 
    } 

    public String net.customers.PersonCustomer.getPersonCommercialStatus() { 
     return PersonCommercialStatus; 
    } 

    public void net.customers.PersonCustomer.setPersonCommercialStatus(String personCommercialStatus) { 
     PersonCommercialStatus = personCommercialStatus; 
    } 

    @Around("execution(* net.xxx.xxx.xxx.DataMigration.populateMap(..))") 
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable { 
    Object arguments[] = joinPoint.getArgs(); 

    if (arguments != null) { 
     HashMap<String, String> hMap = (HashMap) arguments[0]; 
     PersonCustomer cus = (PersonCustomer) arguments[1]; 

    return joinPoint.proceed(); 
} 

Если у кого есть идеи, пожалуйста, дайте мне знать.

С уважением, FT

ответ

0

Первое предложение, я бы избежать смешивания кода в стиле AspectJ с аннотаций стиле. Т.е. вместо @Around используйте around.

Во-вторых, вместо того, чтобы аргументы из joinPoint, вы должны связать их в срезом точек:

Object around(Map map, PersonCustomer cust) : 
    execution(* net.xxx.xxx.xxx.DataMigration.populateMap(Map, PersonCustomer) && args(map, cust) { 
    ... 
    return proceed(map, cust); 
} 

Теперь, чтобы ответить на ваш вопрос: вы также должны использовать объявления интертипных добавлять новые поля к класс, так что-то вроде этого:

private String net.customers.PersonCustomer.OfflineRiskCategory; 
private String net.customers.PersonCustomer.OnlineRiskCategory; 
private String net.customers.PersonCustomer.PersonCommercialStatus; 

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

Смежные вопросы