限制注释的类类型

时间:2018-07-28 05:20:02

标签: java android annotations

ClassDef中是否有像IntDef的{​​{1}}这样的annotation来限制annotation的类型?

@ClassDef({
    Integer, String, Long
})
public @interface MyRestrictedData {
}

因此,我可以将其用作:public void showData(@MyRestrictedData Object myData)

1 个答案:

答案 0 :(得分:1)

此要求不能由注释处理器解决。

它只能由运行时容器(例如Spring)来完成。

但是实际上,容器只是帮助您通过代理检查它。你为什么不能自己做?像这样:

public class MyRestrictedData {
  public static void check(Object o){
    if(!(String.class.isInstance(o) || Integer.class.isInstance(o) || Long.class.isInstance(o)))
      throw new IllegalArgumentException("Must be String, Integer or Long.");
  }
}

public void showData(Object myData) {
  MyRestrictedData.check(myData);
  // then do your work
}

编辑

如果您真的想在编译期间检查,唯一的方法就是zhh所说的,请覆盖您的方法。我不知道什么逻辑需要一起处理StringIntegerLong。但是,如果您确实需要,可以执行以下操作:

public void showData(String s){
  showData((Object)s);
}

public void showData(Integer i){
  showData((Object)i);
}

public void showData(Long l){
  showData((Object)l).
}

private void showData(Object o){
  // do your work here, note this method is PRIVATE
}