代码之家  ›  专栏  ›  技术社区  ›  mhshams

Java注解-寻找保留策略.CLASS

  •  21
  • mhshams  · 技术社区  · 14 年前

    • 保留策略.CLASS 注释将由 运行时的VM。

    • 保留策略.RUNTIME 注释将由 反省地。

    我正在寻找一个“类”保留政策的样本。当我们需要使用此策略而不是运行时策略时。

    4 回复  |  直到 11 年前
        1
  •  11
  •   skaffman    14 年前

    在我当前项目中拥有的大量库中。我能找到的例子只有 Google Guava com.google.common.annotations.GwtCompatible .

    我不太清楚他们为什么选择这个保留策略,也许是为了工具支持,工具自己读取类文件,而不是通过反射API。不过,我不确定我是否真的明白这种区别的意义。

        2
  •  19
  •   Marek Fort    12 年前

    http://proguard.sourceforge.net 例如,当您需要保持类名不变以便能够调用如下方法时,annotation@KeepName将禁用名称损坏Class.forName类().

        3
  •  8
  •   SANN3    11 年前
        4
  •  2
  •   Ciro Santilli OurBigBook.com    6 年前

    最小示例

    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    
    @Retention(RetentionPolicy.CLASS)
    @interface RetentionClass {}
    
    @Retention(RetentionPolicy.RUNTIME)
    @interface RetentionRuntime {}
    
    public static void main(String[] args) {
        @RetentionClass
        class C {}
        assert C.class.getAnnotations().length == 0;
    
        @RetentionRuntime
        class D {}
        assert D.class.getAnnotations().length == 1;
    }
    

    javap 在带注释的类上,我们看到 Retention.CLASS 带注释的类获得 RuntimeInvisible 类属性:

    #14 = Utf8               LRetentionClass;
    [...]
    RuntimeInvisibleAnnotations:
      0: #14()
    

    虽然 Retention.RUNTIME 批注获取 RuntimeVisible 类属性:

    #14 = Utf8               LRetentionRuntime;
    [...]
    RuntimeVisibleAnnotations:
      0: #14()
    

    所以这两种情况下的信息都是以字节码的形式出现的。

    因此, Runtime.CLASS

    Examples on GitHub 给你玩。