interface JDK 1.8

1. 注解

注解是一种特殊的注释, 是一个修饰符, 本质上不参与程序的执行.

注解的特殊在于可以被编译器和 JVM 识别, 如果想让它参与必须通过反射方式.

注解的实际应用是代替复杂的配置文件.

2. 分类

2.1. 标记型注解

标记型注解不需要传递参数.

@Override

作用 : 提醒编译器, 帮助我们作方法覆盖条件的检查

  1. /*
  2. * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
  3. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  4. */
  5. package java.lang;
  6. import java.lang.annotation.*;
  7. /**
  8. * Indicates that a method declaration is intended to override a
  9. * method declaration in a supertype. If a method is annotated with
  10. * this annotation type compilers are required to generate an error
  11. * message unless at least one of the following conditions hold:
  12. *
  13. * <ul><li>
  14. * The method does override or implement a method declared in a
  15. * supertype.
  16. * </li><li>
  17. * The method has a signature that is override-equivalent to that of
  18. * any public method declared in {@linkplain Object}.
  19. * </li></ul>
  20. *
  21. * @author Peter von der Ah&eacute;
  22. * @author Joshua Bloch
  23. * @jls 9.6.1.4 @Override
  24. * @since 1.5
  25. */
  26. @Target(ElementType.METHOD)
  27. @Retention(RetentionPolicy.SOURCE)
  28. public @interface Override {
  29. }

@Deprecated

作用 : 提醒使用者, 它所修饰的目标过期, 不建议使用.

package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;

/**
 * A program element annotated &#64;Deprecated is one that programmers
 * are discouraged from using, typically because it is dangerous,
 * or because a better alternative exists.  Compilers warn when a
 * deprecated program element is used or overridden in non-deprecated code.
 *
 * @author  Neal Gafter
 * @since 1.5
 * @jls 9.6.3.6 @Deprecated
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

@SuppressWarnings

作用 : 提醒编译器, 它修饰的目标中的编译器警告忽略掉. 必须传参


/**
 * Indicates that the named compiler warnings should be suppressed in the
 * annotated element (and in all program elements contained in the annotated
 * element).  Note that the set of warnings suppressed in a given element is
 * a superset of the warnings suppressed in all containing elements.  For
 * example, if you annotate a class to suppress one warning and annotate a
 * method to suppress another, both warnings will be suppressed in the method.
 *
 * <p>As a matter of style, programmers should always use this annotation
 * on the most deeply nested element where it is effective.  If you want to
 * suppress a warning in a particular method, you should annotate that
 * method rather than its class.
 *
 * @author Josh Bloch
 * @since 1.5
 * @jls 4.8 Raw Types
 * @jls 4.12.2 Variables of Reference Type
 * @jls 5.1.9 Unchecked Conversion
 * @jls 5.5.2 Checked Casts and Unchecked Casts
 * @jls 9.6.3.5 @SuppressWarnings
 */
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    /**
     * The set of warnings that are to be suppressed by the compiler in the
     * annotated element.  Duplicate names are permitted.  The second and
     * successive occurrences of a name are ignored.  The presence of
     * unrecognized warning names is <i>not</i> an error: Compilers must
     * ignore any warning names they do not recognize.  They are, however,
     * free to emit a warning if an annotation contains an unrecognized
     * warning name.
     *
     * <p> The string {@code "unchecked"} is used to suppress
     * unchecked warnings. Compiler vendors should document the
     * additional warning names they support in conjunction with this
     * annotation type. They are encouraged to cooperate to ensure
     * that the same names work across multiple compilers.
     * @return the set of warnings to be suppressed
     */
    String[] value();
}

2.2. 元注解

注解的注解, 作用是约束注解.

@Target

作用: 是限定自定义注解可以用在什么地方.

package java.lang.annotation;

/**
 * Indicates that annotations with a type are to be documented by javadoc
 * and similar tools by default.  This type should be used to annotate the
 * declarations of types whose annotations affect the use of annotated
 * elements by their clients.  If a type declaration is annotated with
 * Documented, its annotations become part of the public API
 * of the annotated elements.
 *
 * @author  Joshua Bloch
 * @since 1.5
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

需要传一个数组, 是一个类型数组, ElementType[]

ElementType 是一枚举, 里面有: TYPE, FIELD, METHOD, PARAMETER

@Retention

作用: 是限定自定义注解可以停留在什么时期.

package java.lang.annotation;

/**
 * Indicates how long annotations with the annotated type are to
 * be retained.  If no Retention annotation is present on
 * an annotation type declaration, the retention policy defaults to
 * {@code RetentionPolicy.CLASS}.
 *
 * <p>A Retention meta-annotation has effect only if the
 * meta-annotated type is used directly for annotation.  It has no
 * effect if the meta-annotated type is used as a member type in
 * another annotation type.
 *
 * @author  Joshua Bloch
 * @since 1.5
 * @jls 9.6.3.2 @Retention
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}

有 3 个级别: RetentionPolicy.SOURCE 源码, RetentionPolicy.CLASS 类文件中保留, RetentionPolicy.RUNTIME 运行时,可反射.

@Document

作用: 标识类型是否要被收入javadoc

package java.lang.annotation;

/**
 * Indicates that annotations with a type are to be documented by javadoc
 * and similar tools by default.  This type should be used to annotate the
 * declarations of types whose annotations affect the use of annotated
 * elements by their clients.  If a type declaration is annotated with
 * Documented, its annotations become part of the public API
 * of the annotated elements.
 *
 * @author  Joshua Bloch
 * @since 1.5
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}


@Inherited

作用: 使用此注解声明出来的自定义注解, 在使用此自定义注解时, 如果注解在类上面时, 子类会自动继承此注解, 否则的话子类不会继承此注解. 这里一定要记住, 使用 Inherited 声明出来的注解, 只有在类上使用时才会有效, 对方法, 属性等其他无效.
**

package java.lang.annotation;

/**
 * Indicates that an annotation type is automatically inherited.  If
 * an Inherited meta-annotation is present on an annotation type
 * declaration, and the user queries the annotation type on a class
 * declaration, and the class declaration has no annotation for this type,
 * then the class's superclass will automatically be queried for the
 * annotation type.  This process will be repeated until an annotation for this
 * type is found, or the top of the class hierarchy (Object)
 * is reached.  If no superclass has an annotation for this type, then
 * the query will indicate that the class in question has no such annotation.
 *
 * <p>Note that this meta-annotation type has no effect if the annotated
 * type is used to annotate anything other than a class.  Note also
 * that this meta-annotation only causes annotations to be inherited
 * from superclasses; annotations on implemented interfaces have no
 * effect.
 *
 * @author  Joshua Bloch
 * @since 1.5
 * @jls 9.6.3.3 @Inherited
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

3. 自定义注解

写法像接口, 是一个标记型注解.

package core.annotationu.work;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * <p>MyAnnm 自定义注解</p>
 *
 * <p>包含 1 个 String 型value属性, 1 个 int 型 num 属性
 * 并且此注解只能修饰类和属性, 此注解也可以通过反射处理.</p>
 *
 * @author Zhang Chao
 * @version java_day18
 * @date 2020/4/13 8:54 上午
 */
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnn {
    String value();
    int num() default 10;
}

自定义注解的使用:

@MyAnn(value = "Amos", num = 100)
class A {
    @MyAnn(value = "Hello")
    int n = 1;
}

Rerefences