设为首页 加入收藏

TOP

java注解与反射详解(一)
2023-07-26 08:16:59 】 浏览:103
Tags:java 解与反

一、注解篇

1.1、注解的基本概念

  1. 注解:一种代码级别的说明,它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次;它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释.

    要将注解(annotation)和注释(commnet)分开,注释是给人看的,机器不会执行,而注解主要是是给机器“看的”;

    比如多线程中重写run()方法,会有一个@Override注解,该注解一是给人说明这个方式是一个重写方法,而是给机器做检查(如果你重写的方法名等不正确会报错!)

    注解和反射是许多java框架的底层,因此必须学好!

  2. 作用

    1. 编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
    2. 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
    3. 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

    总结:注解就是java代码的一种,可以认为是一种类型,并且主要是给机器看的

  3. 注解格式

    @<注解名>[(参数)]
    # @Override
    # @SuppressWarning("all")
    

1.2、java内置注解

1.2.1、作用在代码的注解

①、@Override

  1. 作用: 检查该方法是否是重写方法;如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误.

  2. 代码演示:

    package kuang.annotation.lesson1;
    
    /**
     * 测试Override的案例
     */
    public class TestOverride {
        @Override
        public String tostring() {    //  重写的toString方法,这里将S改为小写会报错,因为Object中没有该方法
            return "TestOverride{}";
        }
    
        public static void main(String[] args) {
    
        }
    }
    
  3. 效果展示:

    上方代码将toString方法的S改为了小写,@Overside检查后发现父类(Object类)中没有该方法,会发生编译错误

②、@Deprecated

  1. 作用:标记过时方法,标明该方法在该版本JDK过时或有更好的替代;如果使用该方法,会报编译警告,但不影响运行。

  2. 代码演示:

    package kuang.annotation.lesson1;
    
    /**
     * 测试Deprecated的演示
     */
    public class TestDeprecated extends Thread {
        /**
         * 参数since,表示已注解的API元素已被弃用的版本
         * 参数forRemoval,元素表示注解的API素在将来的版本中是否被删除
         * 这两个参数是java9之后新增的,平时可以不用
         */
        @Deprecated(since = "9",forRemoval = true)   //  使用废弃注解标明该方法已经不推荐使用
        public static void test() {
            System.out.println("废弃注解测试");
        }
    
        public static void main(String[] args) {
            test();  //  废弃方法在同一个类中,会直接标明该方法
            new Thread("小明").stop();  // 通过继承等方式调用被弃用方法,会有个横线划掉方法
        }
    }
    
  3. 效果展示

③、@SuppressWarnings

  1. 作用:指示编译器去忽略注解中声明的警告,可以使用参数标明镇压警告的对象,可以是构造器、方法、类等

  2. 代码演示:

    package kuang.annotation.lesson1;
    
    /**
     * 测试镇压警告注解的demo
     */
    @SuppressWarnings("all")   //  使用镇压警告后,idea不会提示警告代码,并且代码在编译时,jvm也会包容警告
    public class TestSuppressWarning {
        public static void main(String[] args) {
            //  未使用的变量发生警告
            int a;
            int c;  
            int[] array = new int[1024];
    
            System.out.println(1 == 1.2);  //  警告
        }
    }
    
  3. 效果展示:

    idea没有提示警告代码

1.2.2、元注解

元注解(meta-annotation),就是负责注解其他注解的注解,套娃滴干活

  1. 元注解

    1. @Target:用来标明注解的使用范围
    2. @Retention:指定其所修饰的注解的保留策略,保留策略有三个:SOURCE(源码级)、CLASS(字节码级)、RUNTIME(运行时级),最用范围依次变大
    3. @Document:该注解是一个标记注解,用于指示一个注解将被文档化
    4. @Inherited:该注解使父类的注解能被其子类继承
    5. @Repeatable:Java 8 开始支持,标识某注解可以在同一个声明上使用多次、
    6. @FunctionalInterface :Java 8 开始支持,标识一个匿名函数或函数式接口
    7. @SafeVarargs : Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告
  2. 代码演示

    package kuang.annotation.lesson1;
    
    
    import java.lang.annotation.*;
    
    public class TestMetaAnnotation {
        public static void main(String[] args) {
    
        }
    
        @Target(ElementType.METHOD)    //  注解应用于方法上
        @Retention(value = RetentionPolicy.RUNTIME)   //  表示该注解一直到运行时有效
        @Documented   //  表示将注解生成在javaDoc中,不加则在javaDoc中不生成
        @Inherited    //   子类可以继承父类的注解
        @interface myAnnotation {
            //  我定义的注解
        }
    }
    
    

1.3、自定义注解

  1. 规范

    1. 使用关键字@interface <注解名>定义注解
    2. 注解体中可以包含配置参数,配置参数的形式为<基本类型> 配置参数名(),必须加上括号,类似一个方法
    3. 配置参数可以有多个,且名称自定义,可以使用default关键字给配置参数加上默认值
    4. 带配置参数的注解被引用时,参数部分必须以键值对形式写出来,有默认值的可以不写(也可以写,就是覆盖掉默认值),没有默认值的配置参数必须写上值
    5. 单个配置参数可以使用默认参数名value,该名称在注解被时引用时可以省略
  2. 代码演示

    注解定义部分

    package kuang.annotation.lesson1;
    
    import java.lang.annotation.*;
    
    /**
     * 注解定义:
     * 1.@interface关键字来定义注解
     * 2.注解体中可以包含配置参数
     * 3.配置参数需要有类型和配置参数名,参数类型都是基本数据类型,参数名类似方法名,需要用()
     * 4.自定义注解一般需要使用元注解,如@Target等来修饰,但可有可无
首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring循环依赖 下一篇读Java实战(第二版)笔记07_用Op..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目