在每个注释的构造函数之后自动设置属性

时间:2014-11-25 12:04:32

标签: java constructor annotations

我有一节课。像这样:

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

现在我想要一个属性“Version”,它在构造后自动给出。是否可以按注释解决它?最好的解决方案是,如果我可以在某些类之上编写类似@VersionControl的注释,然后另一个模块为类设置属性“version”。

这样的事情:

@VersionControl
public class Example {

  int version; //this should be set automatically

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

有可能吗?谢谢你的帮助!

1 个答案:

答案 0 :(得分: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;
 }

}

在此解决方案中,将在调用带注释的类的构造函数后设置版本。