2015-01-21 9 views
1

나는 아이디어가 있고 그것을 알고 싶다, 가능하다면, 그렇다면, 어떻게. 저는 다른 사용자가 자신의 인생을 단순화하기 위해 도서관에서 작업하고 있습니다.주석을 사용하여 코드 외부에서 코드를 만들 수 있습니까?

두 개의 주석이 있습니다.

다윈 :

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Darwin {} 

DarwinVersion :

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface DarwinVersion {} 

그리고 한 측면.

DarwinAspect :

public privileged aspect DarwinAspect { 

private final static Logger LOGGER = LoggerFactory.getLogger(DarwinAspect.class); 

after(): execution((@bla.Darwin *).new(..)) { 
    int numberOfDarwinVersionFields = 0; 
    LOGGER.debug("Try to add version!"); 
    try { 
     Field darwinVersionField = null; 
     for (Field field : thisJoinPoint.getTarget().getClass().getDeclaredFields()) { 
      if (field.isAnnotationPresent(DarwinVersion.class)) { 
       numberOfDarwinVersionFields++; 
       LOGGER.debug("DarwinVersion found on field " + field + "!"); 
       darwinVersionField = field; 
      } 
     } 
     if (numberOfDarwinVersionFields > 1) { 
      LOGGER.error("To many @DarwinVersion annotations in class " + thisJoinPoint.getTarget().getClass() + "!"); 
     } else if (numberOfDarwinVersionFields == 0) { 
      LOGGER.error("No DarwinVersion field found in class " + thisJoinPoint.getTarget().getClass() + "!"); 
     } else if (darwinVersionField != null) { 
      LOGGER.debug("Set DarwinVersion on field " + darwinVersionField + "!"); 
      darwinVersionField.setAccessible(true); 
      darwinVersionField.set(thisJoinPoint.getTarget(), VersionProvider.getVersion(thisJoinPoint.getTarget().getClass())); 
     } 
    } catch (IllegalAccessException e) { 
     LOGGER.error(e.getLocalizedMessage()); 
    } 
} 

} 

(생성자가 호출 된 후 모든 객체에 자동으로 DarwinVersion을 설정합니다이 코드.)

아이디어는 자신의 클래스를 선언 사용자의 클래스를 직조하는 것입니다 주석. 그들은 오직 자신의 클래스 패스에 내 라이브러리를 추가해야합니다. 이 예와 같이 :

@Darwin 
public class Example { 

@DarwinVersion 
private Long version; 

public static void main(String[] args) { 

    Example example = new Example(); 
    System.out.println(example); 

} 

@Override 
public String toString() { 
    return "Example{" + "version=" + version + '}'; 
} 
} 

이 코드는 효과가 있지만, 나 자신의 프로젝트에서만 작동합니다. Darwin 라이브러리를 포함하고 testclass에 주석을 달아주는 testproject에서, 주석은 무시되고 코드는 만들어지지 않을 것이다. 로드 시간 짜기로 가능합니까?

+0

로드 타임 직조로는 거의 * 아무것도 * 가능합니다. –

+0

괜찮지 만 사용자가 없어도 LTW를 활성화하려면 어떻게해야합니까? 현재 Mojo의 AspectJ Maven 플러그인을 사용하여 코드를 짜기 시작했다. – mrclrchtr

답변

0

예, 사용자가 수행하지 않고 LTW 일 수 있습니다. 무엇이든입니다. 적어도 그녀는 -javaagent:pathto/aspectjweaver.jar을 통해 JVM 명령 행에 제직 에이전트를 배치해야합니다.