zoukankan      html  css  js  c++  java
  • 关于JAVA注解的学习

    关于JAVA注解的学习

    3、注解

    3.1、注解,或者叫做注释类型,英文单词是:Annotation

    3.2、注解Annotation是一种引用数据类型。编译之后也是生成xxx.class文件。

    3.3、怎么自定义注解呢?语法格式?

     [修饰符列表] @interface 注解类型名{

         }

    3.4、注解怎么使用,用在什么地方?

    第一:注解使用时的语法格式是:
    @注解类型名

    第二:注解可以出现在类上、属性上、方法上、变量上等....
    注解还可以出现在注解类型上。

     1 /**
     2  * 注解,或者注释(Annotation)
     3  * 引用数据类型  
     4  * 语法:
     5  *  [修饰符列表] @interface 注解类型名{
     6  *          
     7  *          }
     8  * @author yumu
     9  *
    10  *  关于JDK lang包下的@Override注解
    11  *  只能注解方法  是给编译器看的,和运行阶段没关系
    12  *  如果不是父类重写的方法,编译器就回报错
    13  *  
    14  *  注解属性可以是哪一种类型:
    15  *    byte short long float double boolean char String class 枚举类型
    16  *     以及以上每一种的数组形态
    17  */
    18 public class AnnotationTest01 {
    19     @Override
    20     public String toString(){
    21         return "toString";
    22     }
    23     //@MyAnnotation  报错原因,如果注解中有属性,必须给属性赋值(除非属性有默认值)
    24     @MyAnnotation(name = "张三")   
    25     //@MyAnnotation("张三")  //属性是value时,并且只有一个是,value可以省略
    26     public void dosome(){
    27         
    28         
    29     }
    30 }


    3.5、JDK内置了哪些注解呢?

    java.lang包下的注释类型:

    掌握:
    Deprecated 用 @Deprecated 注释的程序元素,
    不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。

    掌握:
    Override 表示一个方法声明打算重写超类中的另一个方法声明。

    不用掌握:
    SuppressWarnings 指示应该在注释元素(以及包含在该注释元素中的
    所有程序元素)中取消显示指定的编译器警告。

    3.6、元注解
    什么是元注解?
    用来标注“注解类型”的“注解”,称为元注解。

    常见的元注解有哪些?
    Target
    Retention

    关于Target注解:
    这是一个元注解,用来标注“注解类型”的“注解”
    这个Target注解用来标注“被标注的注解”可以出现在哪些位置上。

    @Target(ElementType.METHOD):表示“被标注的注解”只能出现在方法上。
    @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
    表示该注解可以出现在:
    构造方法上
    字段上
    局部变量上
    方法上
    ....
    类上...

    关于Retention注解:
    这是一个元注解,用来标注“注解类型”的“注解”
    这个Retention注解用来标注“被标注的注解”最终保存在哪里。

    @Retention(RetentionPolicy.SOURCE):表示该注解只被保留在java源文件中。
    @Retention(RetentionPolicy.CLASS):表示该注解被保存在class文件中。
    @Retention(RetentionPolicy.RUNTIME):表示该注解被保存在class文件中,并且可以被反射机制所读取。

    3.7、Retention的源代码

    //元注解
    public @interface Retention {
    //属性
    RetentionPolicy value();
    }

    RetentionPolicy的源代码:
    public enum RetentionPolicy {
       SOURCE,
       CLASS,
       RUNTIME
    }

    //@Retention(value=RetentionPolicy.RUNTIME)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation{}

     

    3.8、Target的源代码

    3.9、注解在开发中有什么用呢?

    需求:
    假设有这样一个注解,叫做:@Id
    这个注解只能出现在类上面,当这个类上有这个注解的时候,
    要求这个类中必须有一个int类型的id属性。如果没有这个属性
    就报异常。如果有这个属性则正常执行!

    1 package javase.annotation3;
    2 @Id
    3 public class User {
    4     int id;
    5     String name;
    6     String password;
    7 }
     1 package javase.annotation3;
     2 
     3 import java.lang.annotation.ElementType;
     4 import java.lang.annotation.Retention;
     5 import java.lang.annotation.RetentionPolicy;
     6 import java.lang.annotation.Target;
     7 
     8 
     9 
    10 //表示这个注解只能出现在类上面
    11 @Target(ElementType.TYPE)
    12 //可以被反射机制读取
    13 @Retention(RetentionPolicy.RUNTIME)
    14 public @interface Id {
    15     
    16 
    17 }
    18 //这个注解@Id用来标注一个类,被标注的类必须与一个int类型的id 
    package javase.annotation3;
    
    public class hasNotIdPropertyException extends RuntimeException{
        public hasNotIdPropertyException(){
            
        }
        public hasNotIdPropertyException(String s){
            super(s);
        }
    }
     1 package javase.annotation3;
     2 
     3 import java.lang.reflect.Field;
     4 
     5 public class Test {
     6 
     7     public static void main(String[] args) throws Exception {
     8         Class userClass=Class.forName("javase.annotation3.User");
     9         //判断类上是否有Id注解
    10         boolean isOk=false;
    11         if(userClass.isAnnotationPresent(Id.class)){
    12             //当一个类上有Id注解的时候,要求必须存有int的id属性
    13             Field[] fields = userClass.getDeclaredFields();
    14             
    15             for(Field filed:fields){
    16                 if("id".equals(filed.getName())&&"int".equals(filed.getType().getSimpleName())){
    17                     //表示这个类是合法的,有@Id注解,有int类型id
    18                     isOk=true;
    19                     break;
    20                 }
    21             }
    22             //判断是否合法
    23             if(!isOk){
    24                 throw new hasNotIdPropertyException("不合法,必须有一个int类型的id属性");
    25     }
    26         
    27             
    28             
    29         }
    30 
    31     }
    32     }
  • 相关阅读:
    JavaScript 类型转换 Type Convertion
    JavaScript 对象 Object
    Git失误操作导致文件冲突、路径错误
    Swift 3.0统计缓存并清理-----(斯威夫特3.0 坑爹之获取文件大小)
    iOS ——屏幕截图
    iOS 控件设置虚线
    Swift_单例的打开方式
    第三方接入小记
    图片自定义圆角
    自定义搜索框-输入框光标不贴边
  • 原文地址:https://www.cnblogs.com/yumu77/p/13869340.html
Copyright © 2011-2022 走看看