나는 아이디어가 있고 그것을 알고 싶다, 가능하다면, 그렇다면, 어떻게. 저는 다른 사용자가 자신의 인생을 단순화하기 위해 도서관에서 작업하고 있습니다.주석을 사용하여 코드 외부에서 코드를 만들 수 있습니까?
두 개의 주석이 있습니다.
다윈 :
@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에서, 주석은 무시되고 코드는 만들어지지 않을 것이다. 로드 시간 짜기로 가능합니까?
로드 타임 직조로는 거의 * 아무것도 * 가능합니다. –
괜찮지 만 사용자가 없어도 LTW를 활성화하려면 어떻게해야합니까? 현재 Mojo의 AspectJ Maven 플러그인을 사용하여 코드를 짜기 시작했다. – mrclrchtr