• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Dixon_Liang

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Annotation 注解

package com.changyonglei.meijulei_zhujie.Annotation;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Date;

/**
 *注解的使用
 *
 *
 *1.理解Annotation :
 *      (1)jdk 5.0新增的功能
 *      (2)Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,
 *      并且执行相对的处理。程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
 *      (3)在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中
 *      注解占据了更重要的角色,例如用来配置应用程序的任何切面,
 *      代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
 *
 *2.Annotation的使用示例
 * 示例一:     生成文档相关的注解
 *
 * 示例二:        在编译时进行格式检查(JDK内置的三个基本注解)
 * @Override: 限定重写父类方法,该注解只能用于方法
 * @Deprecated: 用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
 * @SuppressWarnings: 抑制编译器警告
 *
 * 示例三:跟踪代码依赖性,实现替代配置文件功能
 *
 *
 *3.如何自定义注解:参照@SuppressWarnings去定义
 *      (1).注解声明为:@interface。
 *      (2).内部定义成员,通常使用value表示。
 *      (3).可以指定成员的默认值,使用default定义。
 *      (4).如果自定义注解没有成员,表明是一个标识作用。
 *
 * 如果注解有成员,在使用注解时,需要指名成员的值。
 * 自定义注解必须配上注解的信息处理流程(使用反射)才有意义。
 * 自定义注解通过都会指明两个元注解: Retention. Target
 *
 *
 * 4. jdk提供的4种元注解
 * 元注解:对现有的注解进行解释说明的注解
 *      (1)Retention:指定所修饰的 Annotation 的生命周期: SOURCE \CLASS(默认行为)\RUNTIME
 *               只有声明为RUNTIME生命周期的注解,才能通过反射获取。
 *      (2)Target:用于指定被修饰的Annotation能用于修饰哪些程序元素。
 *****************以下出现频率比较低****************************
 *      (3)Documented:表示所修饰的注解在被javadoc解析时,保留下来。
 *      (4)Inherited:被它修饰的Annotation将具有继承性。
 *
 *
 * 5.通过反射获取注解信息----到反射内容时在系统性讲解。
 *
 *
 * 6.jdk 8中注解的新特性:可重复注解、类型注解:
 *      6.1可重复注解:
 *              (1).在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
 *              (2).MyAnnotation的Target、@Inherited和Retention等元注解与MyAnnotations相同。
 *      6.2类型注解:
 *          ElementType.TYPE_PARAIMETER表示该注解能写在类型变量的声明语句中(如:泛型声明)。
 *          ElementType.TYPE_USE表示该注解能写在使用类型的任何语句中。
 *
 *
 * @author Dixon
 * @create 2022-06-04 12:09
 */
public class AnnotationTest {
    public static void main(String[] args) {
        //Date类就@Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
        Date date = new Date(2018, 5, 19);
        System.out.println(date);

        //@SuppressWarnings: 抑制编译器警告 没sout之前是灰色的,sout后白色了。加上注解后不变成灰色
        @SuppressWarnings("unused")
        int num =10;
//        System.out.println(num);

        @SuppressWarnings({"unused","rawtypes"})
        ArrayList list =new ArrayList();
    }

    //Inherited 继承性的举例子
    @Test
    public void testGetAnnotation(){
        Class clazz = Student.class;
        Annotation[] annotations =clazz.getAnnotations();
        for (int i = 0; i < annotations.length; i++) {
            System.out.println(annotations[i]);//@com.changyonglei.meijulei_zhujie.Annotation.MyAnnotation(value=hahaha)
        }
    }
}

//@MyAnnotations({@MyAnnotation(value = "hello"), @MyAnnotation(value = "love")}) //jdk8之前的老写法
//可重复注解
@MyAnnotation(value = "hello")
@MyAnnotation(value = "love")
class Person{
    private String name;
    private int age;

    public Person() {
    }

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

    public void walk(){
        System.out.println("人走路");
    }

    public void eat(){
        System.out.println("人吃饭");
    }
}

interface Info{
    public abstract void show();
}

class Student extends Person implements Info{
    //@Override: 限定重写父类方法,该注解只能用于方法
    @Override
    public void walk() {
        System.out.println("学生走路");
    }

    //@Override: 限定重写父类方法,该注解只能用于方法
    @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;
    }

}
package com.changyonglei.meijulei_zhujie.Annotation;

import java.lang.annotation.*;

/**
 * @author Dixon
 * @create 2022-06-04 15:33
 */

@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
        })
@Inherited
public @interface MyAnnotation {

    String value() default "hahaha";
}
package com.changyonglei.meijulei_zhujie.Annotation;

import java.lang.annotation.*;

/**
 * @author Dixon
 * @create 2022-06-04 16:25
 */


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,
        ElementType.FIELD,
        ElementType.METHOD,
        ElementType.PARAMETER,
        ElementType.CONSTRUCTOR,
        ElementType.LOCAL_VARIABLE})
@Inherited
public @interface MyAnnotations {
    MyAnnotation[] value();
}

 

posted on 2022-06-04 20:30  Dixon_Liang  阅读(34)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3