Java 注解与反射 01 —— 注解

系列文章目录

Java 注解与反射 01 —— 注解
Java 注解与反射 02 —— 反射



什么是注解

Java 从 JDK 5.0 引入注解(Annotation)。

Annotation的作用:

  1. 不是程序本身,但可以对程序做出解释。(这一点和注释类似)
  2. 可以被其他程序(例如编译器)读取。

Annotation的格式:@注释名,也可以添加一些参数值,例如:@SuppressWanings(value=“unchecked”)。

Annotation可以附加在package,class,method,field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素的访问。

内置注解

  • @Override :这个我们经常看到,没错,就是表示某个方法将重写超类中的一个方法。若重写出错,会出现提示。

    override注解
  • @Deprecate:该注解可用于修饰方法、属性、类,表示不鼓励程序员用这样元素(会出现删除线),可能是因为有危险或有更好选择。(但我们仍可使用)

    deprecate注解
  • SuppressWarning:用于抑制编译时的警告信息,但一般不推荐使用,警告还是有必要的。同时,这个注解需要添加参数。

    • @SuppressWarning(“all”)
    • @SuppressWarning(“unchecked”)
    • @SuppressWarning(value={“unchecked”, “deprecation”})

元注解

元注解的作用是负责注解其他注解,Java 定义了四个标准的 meta-annotation 类型,用于对其他 annotation 类型进行说明。当我们自定义一个注解的时候会用到这个,同时后面学习一些常用框架也会用到。

  • @Target:用于描述注解的使用范围。参数都是枚举类型ElementType。
    • TYPE : 类、接口或枚举声明
    • FIELD: 域(属性)声明
    • METHOD: 方法声明
    • PARAMETER: 参数声明
    • CONSTRUCTOR: 构造方法声明
    • LOCAL_VARIABLE:局部变量声明
    • ANNOTATION_TYPE:注释类型声明
    • PACKAGE: 包声明
    • TYPE_PARAMETER:jdk 1.8新增,标注类型参数
    • TYPE_USE:jdk 1.8 新增,标注类型名称
  • @Retention:表示该注解的生命周期。
    • SOURCE:注解只保留在源文件中,在编译成class文件的时候被遗弃
    • CLASS :注解被保留在class中,但是在jvm加载的时候被抛弃,这个是默认的声明周期。
    • RUNTIME :注解在jvm加载的时候仍被保留。
    • RUNTIME > CLASS > SOURCE,一般用runtime就好。
  • @Documented:表明该注解会写入JavaDoc中。
  • Inherited:表明子类能继承父类中的这个注解。

我们可以看看内置注解 @Deprecated 的源码。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={
    
    CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
    
    
}

这里 @Target 定义该注解范围可以是 CONSTRUCTOR、FIELD、LOCAL_VARIABLE、METHOD、PACKAGE、TYPE,同时该注解生命周期将持续到运行完,也会被生成到 JavaDoc 中。

自定义注解

直接上代码

package lessen09_Annotation;

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

@ClassNameAnnotation("TestAnnotation")
public class TestAnnotation {
    
    
    @MethodAnnotation(methodName = "test1", parameterNum = 2, parameterName = {
    
    "a", "b"})
    public static void test1(int a, int b){
    
    
        System.out.println("deprecate");
    }
}

/**
 * 只有一个参数时,最好参数名用value,
 * 这样后面用该参数时可省略参数名
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface ClassNameAnnotation{
    
    
    String value();
}

/**
 * 自定义的注解里可有多个参数,
 * 可以为参数指定默认值
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MethodAnnotation{
    
    
    String methodName();
    int parameterNum() default 0;
    String[] parameterName() default {
    
    };
}

猜你喜欢

转载自blog.csdn.net/qq_39763246/article/details/113094022