如何在Java中向注释类型添加运行时功能?

时间:2016-04-19 17:37:28

标签: java annotations runtime

我正在尝试理解注释的用例。我读过例如Oracle Annotations Tutorial和其他一些资源。一种总是缺少的示例是,如何实际添加注释功能。

假设我希望有一个注释@SetValueIfNull,当字段,参数或方法等于/返回null时,它会分配/返回给定的值。

我的注释可能是:

package com.stackoverflow.tests.annotations;

/**
 * Replaces null in fields, parameters and methods.
 */
public @interface SetValueIfNull {
  /**
   * Value used to replace null.
   */
  String replacement() default "";
}

这里有一个例子:

package com.stackoverflow.tests.annotations;

public class ReplaceNull {

  @SetValueIfNull(replacement = "Peter")
  private String name;

  public static void main(String[] args) {
    ReplaceNull o = new ReplaceNull();

    // This should print "Peter"
    System.out.println(o.getName());

    // This should print "Julie"
    o.setName(null);
    System.out.println(o.getName());

    // This should print "John"
    o.setName("John");
    System.out.println(o.getName());

    // This should print "Margaret"
    System.out.println(o.maggy());

  }

  String getName() {
    return this.name;
  }

  void setName(@SetValueIfNull(replacement = "Julie") String n) {
    this.name = n;
  }

  @SetValueIfNull(replacement = "Margaret")
  String maggy() {
    return null;
  }

}

不时出现的唯一流行语是“使用反射(或编译器插件)”。我想编译器插件不是运行时功能的方法(除了我不知道如何编写编译器插件)。

那么我的示例有一个简单的解决方案,还是我必须为此开发/使用整个框架?

0 个答案:

没有答案