2011-04-20 4 views
0

몇 주 전 자바 클래스의 fileds에 대한 문자열 상수를 생성하는 방법을 찾고있었습니다 ->Generate constants for class attributes with maven?AspectJ weaving : aspect에 대한 정적 참조없이 코드를 짜는 방법?

나는 그것을 얻었습니다. 나는 상수를 포함하는 aspect를 생성하고 그것을 클래스 파일에 짜 넣는다. 문제는 이제 클라이언트가 Weaved 클래스를 사용하려고 할 때 NoClassDefFound 예외가 발생한다는 것입니다. 그 두 가지 이유가 있습니다

  1. 내가 빌드 과정에서 클라이언트 항아리에서 화면 class 파일을 제거하고 있습니다

  2. 그들은 자신의 클래스 경로에 AspectJ를 lib 디렉토리가없는이

  3. static { 
    CarDTOAspect.ajc$interFieldInit$my.package.CarDTOAspect$my.package.CarDTO$VENDOR(); 
    CarDTOAspect.ajc$interFieldInit$my.package.CarDTOAspect$my.package.CarDTO$NAME(); 
    } 
    
    : 디 컴파일러를 사용

, 나는 클래스가 같은 정적 블록을 가지고 있다는 것을 발견

내 질문 : 내 클라이언트 파일에서 완전히 제거 할 수 있도록 클래스 파일에 실제 "public static final String"-Field를 만드는 옵션이 있습니까? 사전에

감사

마틴 불행하게도

답변

2

, 아니. 이것은 AspectJ가 의도 한 것이 아닙니다. 인터 유형 선언은 실제로 Aspect에 있어야합니다 (타겟 유형에 생성 된 참조가 있음). 이는 범위 지정 규칙에 따라 동일한 이름의 두 필드가 대상 유형에 추가 될 수 있기 때문입니다. 예 :

class C { } 
aspect A1 { private int C.field = 9; } 
aspect A2 { private String C.field = "what???"; } 

이것은 완전히 합법적입니다. 어느 분야도 C 안에 접근 할 수 없습니다. 그들은 그것을 선언하는 측면에서만 접근 할 수 있습니다.

바이트 코드 조작을 수행하려는 경우 ASM 또는 Javassist와 같은 것을 권하고 싶습니다.

+0

안녕하세요, 고마워, 대답은 아니지만 설명 =) 그것은 내 고객이 aspectj에 의존해야만하는 것 같습니다. – martin

관련 문제