[Java] Aprendizaje de Java => [Notas]

Introducción

Java 注解(Annotation)También conocida como anotación de Java, es un mecanismo de anotación introducido por JDK5.0. Las anotaciones son una forma de metadatos que proporcionan datos sobre un programa, pero no sobre el programa en sí. Las anotaciones no tienen un efecto directo en el funcionamiento del código que anotan.

Declaración de anotación

Todas las anotaciones en Java implementan la interfaz de anotación de forma predeterminada:

package java.lang.annotation;
public interface Annotation {
    
    

    boolean equals(Object obj);
    
    int hashCode();
    
    String toString();
    
    Class<? extends Annotation> annotationType();
}

A diferencia de declarar una "Clase", las declaraciones de anotación usan @interfacepalabras clave. Una anotación se declara de la siguiente manera:

public @interface MyInerface{
    
    
}

anotación meta

Las clases anotadas también pueden usar otras declaraciones de anotación al definir anotaciones. La clase de anotación que anota el tipo de anotación se denomina metaanotación (metaanotación). Hay 4 meta-anotaciones.
Generalmente, cuando definimos anotaciones personalizadas, necesitamos especificar dos meta-anotaciones:

@Documented
Solía ​​ser extraído en documentos por la herramienta javadoc,

@Inherited
Indica que las subclases pueden heredar las anotaciones definidas en la clase principal.

@Target
Marque otra anotación para limitar los tipos de elementos Java a los que se puede aplicar la anotación. La anotación de destino especifica uno de los siguientes tipos de elementos como su valor:

ElementType.ANNOTATION_TYPE Se puede aplicar a tipos de anotaciones.
ElementType.CONSTRUCTOR Se puede aplicar a los constructores.
ElementType.FIELD Se puede aplicar a campos o propiedades.
ElementType.LOCAL_VARIABLE Se puede aplicar a variables locales.
ElementType.METHOD Se puede aplicar a las anotaciones a nivel de método.
ElementType.PACKAGESe puede aplicar a declaraciones de paquetes.
ElementType.PARAMETER Parámetros que se pueden aplicar a los métodos.
ElementType.TYPE Se puede aplicar a cualquier elemento de la clase.

@Retention
Especifica cómo se almacenan las anotaciones de marcador:

RetentionPolicy.SOURCE Las anotaciones marcadas solo se mantienen en el nivel de fuente y el compilador las ignora.
RetentionPolicy.CLASS El compilador conserva las anotaciones marcadas en el momento de la compilación, pero la máquina virtual de Java (JVM) las ignora.
RetentionPolicy.RUNTIME La JVM conserva las anotaciones marcadas, por lo que el entorno de tiempo de ejecución puede utilizarlas.

//@Target(ElementType.TYPE) 只能在类上标记该注解
@Target({
    
    ElementType.TYPE,ElementType.FIELD}) // 允许在类与类属性上标记该注解
@Retention(RetentionPolicy.SOURCE) //注解保留在源码中
public @interface MyInerface{
    
    

}

Pasar parámetros al anotar

En las meta-anotaciones anteriores, se permite pasar parámetros cuando se usan anotaciones. También podemos hacer que el cuerpo de las anotaciones personalizadas contenga annotation type element (注解类型元素) declaraciones, que se parecen mucho a los métodos y definen valores predeterminados opcionales.

@Target({
    
    ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface MyInerface{
    
    

    String value(); //无默认值
    
    int age() default 1; //有默认值
    
}

Nota: Al usar anotaciones, si el elemento de tipo en la anotación definida no tiene un valor predeterminado, debe pasarse por valor.

@MyInerface("啊啊啊啊啊啊") //如果只存在value元素需要传值的情况,则可以省略:元素名=
@MyInerface(value="啊啊啊啊啊啊",age = 114514)
int i;

Escenarios de aplicación de anotación

Según el método de almacenamiento de anotaciones definido por la metaanotación @Retention, la anotación se puede utilizar en tres escenarios:

SOURCE

RetentionPolicy.SOURCE, actuando sobre anotaciones a nivel de código fuente, que se pueden usar en escenarios como la verificación de sintaxis IDE y APT.
Use anotaciones de nivel SOURCE en la clase, después de la compilación class中会被丢弃.

CLASS
Las anotaciones definidas como CLASS se aceptarán 保留在class文件, pero lo serán 被虚拟机忽略(es decir, las anotaciones no se pueden obtener mediante reflexión en tiempo de ejecución). En este momento, el escenario de aplicación que cumple totalmente con esta anotación es la operación de código de bytes. Tales como: aplique esta escena en AspectJ, hot fix Roubust.

RUNTIME
注解保留至运行期, lo que significa que podemos combinar la tecnología de reflexión para obtener toda la información en la anotación durante el tiempo de ejecución.

Procesador de anotaciones APT

El nombre completo de APT es " Anotation Processor Tools", que significa procesador de anotaciones. Como su nombre indica, se utiliza para procesar anotaciones. Javac debe compilar un archivo fuente de Java bien escrito y traducirlo a un archivo de clase de código de bytes que la máquina virtual pueda cargar y analizar. El procesador de anotaciones es una herramienta que viene con javac, que se usa para escanear y procesar información de anotaciones en tiempo de compilación. Puede registrar sus propios procesadores de anotaciones para determinadas anotaciones. 注册的注解处理器由 javac调起,并将注解信息传递给注解处理器进行处理.
Los procesadores de anotaciones son los escenarios más utilizados para las anotaciones. Hay procesadores de anotaciones en marcos de uso común como Glide, EventBus3, Butterknifer, Tinker, ARouter, etc. Pero la definición de anotaciones en estos marcos no está en el nivel de FUENTE, sino más bien en el nivel de CLASE.

Supongo que te gusta

Origin blog.csdn.net/qq_43358469/article/details/131309472
Recomendado
Clasificación