0
点赞
收藏
分享

微信扫一扫

Java基础复习:注解

杰克逊爱学习 2022-03-20 阅读 86
java

1.什么是注解(Annotation)?

注解就是代码里的标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。注解可以向修饰符一样被使用,可用于修饰包,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的"name=value"对中。

2.如何自定义注解?

参照@SuppressWarnings定义

(1)注解声明为:@interface

(2)内部定义成员,通常使用value表示

(3)可以指定成员的默认值,使用default定义

(4)如果自定义注解没有成员,表明是一个标识作用

如果有成员,在使用注解时,需要指明成员的值;自定义注解必须配上注解的信息处理流程(使用反射)才有意义。

package com.yan.annotation;

import java.lang.annotation.*;

/**
 * @author yan
 * @description 自定义注解
 * @create 2022-03-20 19:51
 */
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.FIELD,
        ElementType.METHOD, ElementType.PARAMETER,
        ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE,
        ElementType.TYPE_PARAMETER,
        ElementType.TYPE_USE})
public @interface MyAnnotation {
    String value() default "hello";
}

3.JDK中提供的四种元注解:

元注解:对现有的注解进行解释说明的注解

Retention:指定所修饰的Annotation的生命周期:SOURCE\CLASS(默认)\RUNTIME;只有声明为  RUNTIME生命周期的注解才能通过反射获取。

Target:用于指定被修饰的Annotation能被用于修饰哪些程序元素。

Documented(使用频率低):用于指定被该元注解修饰的Annotation类将被javadoc工具提取为文档,  定义为Documented的注解必须设置Retention的值为RUNTIME。

Inherited(频率低):被它修饰的Annotation将具有继承性。

4.可重复注解:

(1)在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class;

(2)MyAnnotation的Target和Retention和MyAnnotations相同。

package com.yan.annotation;

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

/**
 * @author yan
 * @description
 * @create 2022-03-20 20:14
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.FIELD,
        ElementType.METHOD, ElementType.PARAMETER,
        ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE})
public @interface MyAnnotations {
    MyAnnotation[] value();
}

5.类型注解:

(1)ElementType.TYPE_PARAMETER 表示能写在类型变量的声明语句中(如:泛型声明);

(2)ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。

6.类型注解的举例:

package com.yan.annotation;

import java.util.ArrayList;

/**
 * @author yan
 * @description
 * @create 2022-03-20 20:25
 */
interface Info{
    void show();
}
public class Student implements Info{
    @Override
    public void show() {
        System.out.println("哈哈哈");
    }
}

class Generic<@MyAnnotation T>{
    public void show() throws @MyAnnotation RuntimeException{
        ArrayList<@MyAnnotation String> list = new ArrayList<>();
        int num = (@MyAnnotation int) 10L;
    }

}

7.使用反射来获取注解的举例(推荐掌握):

 public void test9(){
        Class<Person> clazz = Person.class;
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(Method m : declaredMethods){
            //1.获取方法声明的注解
            Annotation[] annotation = m.getAnnotations();
            for(Annotation a : annotation){
                System.out.println(a);
            }
}

8.用于反射举例的Person类:

package com.yan.reflection;

/**
 * @author yan
 * @description  Person类,用于反射的举例
 * @create 2022-03-17 21:09
 */
@MyAnnotation(value = "hi")
public class Person extends Creature<String> implements Comparable<String>, MyInterface{
    private String name;
    public int age;
    public int id;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @MyAnnotation(value = "la")
    private Person(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show(){
        System.out.println("你好,我是一个人");
    }

    @MyAnnotation
    private String showNation(String nation){
        System.out.println("我的国籍是:"+nation);
        return nation;
    }

    @MyAnnotation(value = "oye")
    public String display(String interests)throws NullPointerException, ClassCastException{
        return interests;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(String o) {
        return 0;
    }

    @Override
    public void info() {
        System.out.println("我是人");
    }

    private static void showDesc(){
        System.out.println("我是一个帅气的男人");
    }
}

9.用于反射举例的注解:

package com.yan.reflection;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
/**
 * @author yan
 * @description
 * @create 2022-03-17 22:35
 */
@Target({TYPE, FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "hello";
}
举报

相关推荐

0 条评论