注解

2023/6/17 java

# 内置注解

@Override 表示这个方法重写了父类的方法

public class Hero {
    String name;

    @Override
    public String toString() {
        return name;
    }
}

@Deprecated弃用

public class Hero {
    
    @Deprecated
    public void hackMap(){
        
    }
}

# 自定义注解

定义注解

@Target({METHOD,TYPE})表示这个注解可以用用在类/接口上,还可以用在方法上

@Documented表示当执行javadoc的时候,本注解会生成相关文档

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;

@Target({METHOD,TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {
    String ip();
    int port() default 3306;
    String database();
    String encoding();
    String loginName();
    String password();
}

使用注解


@JDBCConfig(ip = "127.0.0.1",database = "test",encoding = "utf-8",loginName = "root",password = "admin")
public class DBUtil {

    public static void main(String[] args) {
        JDBCConfig config = DBUtil.class.getAnnotation(JDBCConfig.class);
        String ip = config.ip();
        int port = config.port();
        String database = config.database();
        String encoding = config.encoding();
        String password = config.password();
        System.out.println(ip);
        System.out.println(port);
        System.out.println(database);
        System.out.println(encoding);
        System.out.println(password);
    }
}

# 元注解

# @Target

@Target 表示这个注解能放在什么位置上

ElementType.TYPE:能修饰类、接口或枚举类型 ElementType.FIELD:能修饰成员变量 ElementType.METHOD:能修饰方法 ElementType.PARAMETER:能修饰参数 ElementType.CONSTRUCTOR:能修饰构造器 ElementType.LOCAL_VARIABLE:能修饰局部变量 ElementType.ANNOTATION_TYPE:能修饰注解 ElementType.PACKAGE:能修饰包

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {
    String ip();
    int port() default 3306;
    String database();
    String encoding();
    String loginName();
    String password();
}

# @Retention

@Retention 表示生命周期

RetentionPolicy.SOURCE:注解只在源代码中存在,编译成class之后,就没了。@Override就是这种注解。

RetentionPolicy.CLASS: 注解在java文件编程成.class文件后,依然存在,但是运行起来后就没了。

RetentionPolicy.RUNTIME:注解在运行起来之后依然存在,程序可以通过反射获取这些信息

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {
    String ip();
    int port() default 3306;
    String database();
    String encoding();
    String loginName();
    String password();
}

# @Inherited

@Inherited表示该注解具有继承性。可以获取到父类DBUtil上的注解信息。

public class DBUtilChild extends DBUtil{

    public static void main(String[] args) {
        JDBCConfig config = DBUtilChild.class.getAnnotation(JDBCConfig.class);
        String ip = config.ip();
        System.out.println(ip);
    }
}