2014-11-25 2 views
0

У меня есть класс. Что-то вроде этого:Автоматически устанавливать атрибут после конструктора в аннотации

public class Example { 
    public Example() { 
    System.out.println("Constructor"); 
    } 
} 

Теперь я хочу иметь атрибут «Версия», который предоставляется автоматически после построения. Можно ли разрешить его в аннотации? Лучшим решением было бы, если бы я мог написать аннотацию типа @VersionControl над некоторыми классами, а затем другой модуль устанавливает атрибут «версия» для классов.

Что-то вроде этого:

@VersionControl 
public class Example { 

    int version; //this should be set automatically 

    public Example() { 
    System.out.println("Constructor"); 
    } 
} 

Возможно ли это? Thx за вашу помощь!

+0

Несомненно. Посмотрите на AspectJ или библиотеки, которые позволяют переписывать байт-коды. Но, как сейчас, ваш вопрос очень широк и, вероятно, не очень подходит для SO. –

+0

Спасибо за ваш комментарий. Я посмотрю на AspectJ и постараюсь ответить на свой вопрос сам. – mrclrchtr

ответ

0

Мое решение с аннотациями и AspectJ:

Аннотация:

@Target(ElementType.TYPE) 
    public @interface MyAnnotation{ 
} 

Аспект:

@Aspect 
public class MyAspect { 

    @Pointcut("execution((@MyAnnotation *).new(..))") 
    public void bla() { 
    } 

    @After("bla()") 
    public void after(JoinPoint joinPoint) { 
    try { 
    joinPoint.getTarget().getClass().getDeclaredField("version").set(joinPoint.getTarget(), VersionProvider.getVersion()); 
    } catch (IllegalAccessException | NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

Пример объекта:

@MyAnnotation 
public class Example { 

public long version; 

public long getDarwinVersion() { 
    return version; 
} 

} 

В этом решении Versio n будет задано после вызова конструктора аннотированного класса.

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