zoukankan      html  css  js  c++  java
  • Java注解

    是什么

    • 放在代码前面,用@表示的部分,是用来描述代码的元数据。
      • 什么是元数据
        • 简单来说:就是描述数据的数据,跟代码业务逻辑无关,在语法,配置层面保证代码的可用性和提供便利的配置方式。
        • 例子:

              她今年三十岁上下,个子高挑,身材匀称,黑黑的眉毛,红红的脸蛋。

              这句话提供了几个信息:年龄(三十岁上下)、身高(个子高挑)、相貌(身材匀称,黑黑的眉毛,红红的脸蛋)

              "年龄"、"身高"、"相貌" 就是元数据。

        • 好处:使信息的描述和分类实现格式化,从而为机器处理创造了可能。

    怎么用

    • 一个使用是Java内置的注解
      • 用于代码检查
        • @Override 用于子类中标记重写的父类的方法,编译器会去检查父类中是否有这个方法,没有报错。
        • @Deprecated 用于标记过期不用的方法,编译器发现代码里面有使用该过期方法时,会发出警告。
        • @SuppressWarnings 用于抑制编译时的警告。
        • @FunctionInterface 用于标注某一个接口是函数式接口。如果不是函数式接口,编译器会报错。
        • 什么是函数式接口?
          • 接口里面只有一个抽象方法。
          • 接口可以被隐式的转换为lambda表达式
      • 对注解进行注解(元注解)
        • @Documented:让注解信息出现在 document 中
        • @Retention : 标记注解如何存储,支持以下三种参数 
          • RetentionPolicy.SOURCE : 注解只保留在源码中,编译时会忽略
          • RetentionPolicy.CLASS : 更高一级,编译时被编译器保留,但是运行时会被 JVM 忽略
          • RetentionPolicy.RUNTIME : 最高级,运行时会被保留,可以被运行时访问
        • @Target :标记注解作用于(修饰)什么对象,支持以下几种参数 
          • ElementType.TYPE : 作用于任何类、接口、枚举
          • ElementType.FIELD : 作用于一个域或者属性
          • ElementType.METHOD : 作用于一个方法
          • ElementType.PARAMTER : 作用于参数
          • ElementType.CONSTRUCTOR : 作用于构造函数
          • ElementType.LOCAL_VARIABLE : 作用于本地变量
          • ElementType. ANNOTATION_TYPE : 作用于注解
          • ElementType.PACKAGE : 作用于包
        • @Inherited 用于标记注解能否被继承。(如果父类添加了某个注解,而这个注解用@Inherited 进行了注解,那么其子类也将默认继承该注解)
    • 一个是自定义注解(需结合反射机制),基本步骤如下:
      • 通过@Interface定义注解并添加元注解信息(选择上面的四个元注解组合)
      • 将自定义注解用于代码中,并用反射机制定义注解处理类
      • 在main方法中执行检查
    • 代码实例
      • 定义注解
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /*
     * @Author:darrenqiao
     * */
    @Retention(RetentionPolicy.RUNTIME) //存储到运行期
    @Target(ElementType.FIELD)  //作用于字段
    @Documented //可以被文档化
    @Inherited //可以被注解的子类继承
    //这里指定自定义注解的作用是检查值是在value为true时确保字段值仅为male和female中的一个
    public @interface MyAnnotation {
        boolean value() default true;
    }
      • 使用 和 处理注解
    import java.lang.reflect.Field;
    
    /*
     * @Author:darrenqiao
     * */
    
    //定义使用自定义注解的类
    class Person {
        
        @MyAnnotation(value = true)
        public String gender;
    
        public Person(String gender) {
            super();
            this.gender = gender;
        }
    }
    
    //通过反射实现对注解的处理
    class CheckAnnotation {
        public static boolean check(Object object) throws IllegalArgumentException, IllegalAccessException {
            Field[] fields = object.getClass().getDeclaredFields();
            for(Field field : fields) {
                String gender = (String) field.get(object);
                return gender.equals("male") || gender.equals("female");
            }
            return false;
        }
    }
    
    public class AnnotationTest {
        
        public static void main(String[] args) throws Exception {
            Person p = new Person("male");
            //调用注解进行检查
            System.out.println(CheckAnnotation.check(p));
        }
    
    }
  • 相关阅读:
    Mysql 表分区
    Java json串生成及转bean
    ZK 样式使用
    ZK 使用jfreeChart
    Struct2 csv文件上传读取中文内容乱码
    Mysql 学习笔记
    java 调用C#webservice
    ace 后台管理模板可取之处
    Linux常用命令大全
    将图片转成base64写进hml,无需依赖本地文件
  • 原文地址:https://www.cnblogs.com/darrenqiao/p/9191816.html
Copyright © 2011-2022 走看看