java注解用法ITeye - 乐橙lc8

java注解用法ITeye

2019年03月13日08时01分50秒 | 作者: 千风 | 标签: 注解,注释,运用 | 浏览: 1570

元数据的效果

假如要关于元数据的效果进行分类,现在还没有清晰的界说,不过咱们能够依据它所起的效果,大致可分为三类:

l         编写文档:经过代码里标识的元数据生成文档。

l         代码剖析:经过代码里标识的元数据对代码进行剖析。

l         编译查看:经过代码里标识的元数据让编译器能完结根本的编译查看。

 

根本内置注释

    @Override注释能完结编译时查看,你能够为你的办法增加该注释,以声明该办法是用于掩盖父类中的办法。假如该办法不是掩盖父类的办法,将会在编译时报错。例如咱们为某类重写toString()办法却写成了tostring(),而且咱们为该办法增加了@Override注释;

     @Deprecated的效果是对不应该在运用的办法增加注释,当编程人员运用这些办法时,将会在编译时显现提示信息,它与javadoc里的@deprecated符号有相同的功用,精确的说,它还不如javadoc @deprecated,由于它不支撑参数,

留意:要了解详细信息,请运用 -Xlint:deprecation 从头编译。

    @SuppressWarnings与前两个注释有所不同,你需求增加一个参数才干正确运用,这些参数值都是现已界说好了的,咱们选择性的运用就好了,参数如下:

 

deprecation   运用了过期的类或办法时的正告

unchecked  执行了未查看的转化时的正告,例如当运用调集时没有用泛型 (Generics) 来指定调集保存的类型

fallthrough   当 Switch 程序块直接通往下一种状况而没有 Break 时的正告

path   在类途径、源文件途径等中有不存在的途径时的正告

serial 当在可序列化的类上短少 serialVersionUID 界说时的正告

finally    任何 finally 子句不能正常完结时的正告

all 关于以上一切状况的正告

 

留意:要了解详细信息,请运用 -Xlint:unchecked 从头编译。

 

定制注释类型

    好的,让咱们创立一个自己的注释类型(annotation type)吧。它相似于新创立一个接口类文件,但为了区别,咱们需求将它声明为@interface,如下例:

public @interface NewAnnotation {

 

}

 

运用定制的注释类型

    咱们现已成功地创立好一个注释类型NewAnnotation,现在让咱们来测验运用它吧,假如你还记住本文的榜首部分,那你应该知道他是一个符号注释,运用也很简略,如下例:

public class AnnotationTest {

 

    @NewAnnotation

    public static void main(String[] args) {

 

    }

}

 

增加变量

    J2SE 5.0里,咱们了解到内置注释@SuppressWarnings()是能够运用参数的,那么自界说注释能不能界说参数个数和类型呢?答案是当然能够,但参数类型只允许为根本类型、String、Class、枚举类型等,而且参数不能为空。咱们来扩展NewAnnotation,为之增加一个String类型的参数,示例代码如下:

public @interface NewAnnotation {

 

    String value();

}

    运用该注释的代码如下:正如你所看到的,该注释的运用有两种写法,这也是在之前的文章里所提到过的。假如你忘了这是怎样回事,那就再去翻翻吧。

public class AnnotationTest {

 

    @NewAnnotation("Just a Test.")

    public static void main(String[] args) {

        sayHello();

    }

 

    @NewAnnotation(value="Hello NUMEN.")

    public static void sayHello() {

        // do something

    }

}

 

为变量赋默认值

    咱们对Java自界说注释的了解正在不断的增多,不过咱们还需求更过,在该条目里咱们将了解到怎样为变量设置默认值,咱们再对NewAnnotaion进行修正,看看它会变成什么姿态,不只参数多了几个,连类名也变了。但仍是很简略了解的,咱们先界说一个枚举类型,然后将参数设置为该枚举类型,并赋予默认值。

public @interface Greeting {

 

    public enum FontColor {RED, GREEN, BLUE};

 

    String name();

 

    String content();

 

    FontColor fontColor() default FontColor.BLUE;

}

 

限制注释运用规模

    当咱们的自界说注释不断的增多也比较杂乱时,就会导致有些开发人员运用过错,首要表现在不应运用该注释的当地运用。为此,Java供给了一个ElementType枚举类型来操控每个注释的运用规模,比如说某些注释只能用于一般办法,而不能用于结构函数等。下面是Java界说的ElementType枚举:

package java.lang.annotation;

 

public enum ElementType {

  TYPE,         // Class, interface, or enum (but not annotation)

  FIELD,        // Field (including enumerated values)

  METHOD,       // Method (does not include constructors)

  PARAMETER,        // Method parameter

  CONSTRUCTOR,      // Constructor

  LOCAL_VARIABLE,   // Local variable or catch clause

  ANNOTATION_TYPE,  // Annotation Types (meta-annotations)

  PACKAGE       // Java package

}

    下面咱们来修正Greeting注释,为之增加限制规模的句子,这儿咱们称它为方针(Target)运用办法也很简略,如下:

 

@Target( { ElementType.METHOD, ElementType.CONSTRUCTOR })

public @interface Greeting {

}

正如上面代码所展现的,咱们只允许Greeting注释标示在一般办法和结构函数上,运用在包声明、类名等时,会提示过错信息。

 

注释坚持性战略

public enum RetentionPolicy {

  SOURCE,// Annotation is discarded by the compiler

  CLASS,// Annotation is stored in the class file, but ignored by the VM

  RUNTIME// Annotation is stored in the class file and read by the VM

}

    RetentionPolicy的运用办法与ElementType相似,简略代码示例如下:

@Retention(RetentionPolicy.RUNTIME)

@Target( { ElementType.METHOD, ElementType.CONSTRUCTOR })

 

文档化功用

    Java供给的Documented元注释跟Javadoc的效果是差不多的,其实它存在的优点是开发人员能够定制Javadoc不支撑的文档特点,并在开发中运用。它的运用跟前两个也是相同的,简略代码示例如下:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target( { ElementType.METHOD, ElementType.CONSTRUCTOR })

public @interface Greeting {

}

 

值得咱们留意的是,假如你要运用@Documented元注释,你就得为该注释设置RetentionPolicy.RUNTIME坚持性战略。为什么这样做,应该比较简略了解,这儿就不提了。

 标示承继

 

承继应该是Java供给的最杂乱的一个元注释了,它的效果是操控注释是否会影响到子类,简略代码示例如下:

@Inherited

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target( { ElementType.METHOD, ElementType.CONSTRUCTOR })

public @interface Greeting {

}

 

读取注释信息

    当咱们想读取某个注释信息时,咱们是在运行时经过反射来完结的,假如你对元注释还有点形象,那你应该记住咱们需求将坚持性战略设置为RUNTIME,也就是说只要注释符号了@Retention(RetentionPolicy.RUNTIME)的,咱们才干经过反射来取得相关信息,下面的比如咱们将沿袭前面几篇文章中呈现的代码,并完结读取AnnotationTest类一切办法符号的注释并打印到操控台。好了,咱们来看看是怎样完结的吧:

public class AnnotationIntro {

 

    public static void main(String[] args) throws Exception {

 

        Method[] methods = Class.forName(

                "com.gelc.annotation.demo.customize.AnnotationTest")

                .getDeclaredMethods();

        Annotation[] annotations;

 

        for (Method method : methods) {

            annotations = method.getAnnotations();

            for (Annotation annotation : annotations) {

                System.out.println(method.getName() + " : "

                        + annotation.annotationType().getName());

            }

 

 

 

Java并发编程中,用到了一些专门为并发编程预备的 Annotation。
首要包含三类:
1、类 Annotation(注解)
就像姓名相同,这些注解是针对类的。主有要以下三个:
@Immutable
@ThreadSafe
@NotThreadSafe

@ThreadSafe 是表明这个类是线程安全的。详细是否真安全,那要看完结者怎样完结的了,横竖打上这个标签仅仅表明一下。不线程安全的类打上这个注解也没事儿。
@Immutable 表明,类是不可变的,包含了 @ThreadSafe 的意思。
      @NotThreadSafe 表明这个类不是线程安全的。假如是线程安全的非要打上这个注解,那也不会报错。

这三个注解,对用户和维护者是有利的,用户能够当即看出来这个类是否是线程安全的,维护者则是能够依据这个注解,要点查看线程安全方面。别的,代码剖析东西可能会运用这个注解。


2、域 Annotation(注解)
域注解是对类里边成员变量加的注解。
3、办法 Annotation(注解)
办法注解是对类里边办法加的注解。

域注解和办法注解都是用@GuardedBy( lock )来标识。里边的Lock是通知维护者:这个状态变量,这个办法被哪个锁维护着。这样能够激烈的提示类的维护者留意这儿。

@GuardedBy( lock )有以下几种运用方式:

1、@GuardedBy( "this" ) 受目标内部锁维护
2、@GuardedBy( "fieldName" ) 受 与fieldName引证相关联的锁 维护。
3、@GuardedBy( "ClassName.fieldName" ) 受 一个类的静态field的锁 保存。
4、@GuardedBy( "methodName()" ) 锁目标是 methodName() 办法的返值,受这个锁维护。
5、@GuardedBy( "ClassName.class" ) 受 ClassName类的直接锁目标维护。而不是这个类的某个实例的锁目标。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表乐橙lc8立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章