• java进阶(42)--注解


    文档目录:

    一、概念

    二、注解的使用方法

    三、JDK内置注解

    四、元注释

    五、注解中定义属性

    六、反射注解的对象

    七、反射注解对象的属性值

    ---------------------------------------分割线:正文--------------------------------------------------------

    一、概念

    1、注解即注释:Annotation

    2、引用数据类型,编译之后包生成xxx.class文件

    3、自定义注解:语法[修饰符列表]@interface 注解类型名{}

     

    二、注解的使用方法

    1、注解使用时语法格式:@注解类型名

    2、注解可以出现在类、属性、方法、变量等几乎任意类型上

     

    三、JDK内置注解

    1、@Deprecated注解

    表示注解的元素已过时,有更好的解决方案

     

    2、@Override注解

    只能注解方法,给编译器参考的,如果不是重写父类方法时编译器会报错

    1     @Override
    2     public String toString() {
    3         return "AnnotationTest01{" +
    4                 "no=" + no +
    5                 '}';
    6     }

     

    四、元注释

    注解注解的注解

    1 @Target(ElementType.METHOD)
    2 @Retention(RetentionPolicy.SOURCE)
    3 public @interface Override {
    4 }

    1、@Target注解

    用来标注的注解可以出现在哪些位置上

    2、@Retention注解

    表示该注解被保存的位置

     

    五、注解中定义属性

    1、如果一个注解中有属性,那必须给属性赋值,除非属性有defalut默认值

    注解:

    package com.bk.java.Test42;
    
    public @interface MyAnnotation {
        String name();
        int no() default 1;
    }

    测试程序:

     1 package com.bk.java.Test42;
     2 
     3 public class AnnotationTest01 {
     4     @MyAnnotation(name="test01")
     5     private int no;
     6     public static void m1(){
     7         int i=100;
     8     }
     9     public AnnotationTest01(){
    10     }
    11 
    12     public String toString() {
    13         return "AnnotationTest01{" +
    14                 "no=" + no +
    15                 '}';
    16     }
    17 }

    2、如果属性值是value且只有一个属性时,使用时可以省略。

    注解:

    package com.bk.java.Test42;
    
    public @interface MyAnnotation {
        String value();
    }

    测试程序:

     1 package com.bk.java.Test42;
     2 
     3 public class AnnotationTest01 {
     4     @MyAnnotation("testvalue01")
     5     private int no;
     6     @MyAnnotation(value = "testvalue02")
     7     public static void m1(){
     8         int i=100;
     9     }
    10     public AnnotationTest01(){
    11     }
    12 
    13 }

    3、注解的属性类型为数组

    注解中可以使用的类型为:

    byte、short、int、long、float、double、boolean、char、String、Class以及每一种的数组形式

    注解:

    package com.bk.java.Test42;
    
    public @interface MyAnnotation {
        String value();
    }

    测试程序:当数组只有一个类型时,大括号可以省略

    1 package com.bk.java.Test42;
    2 
    3 public class OtherAnnotationTest01 {
    4     @OtherAnnotation(age = 10,email = {"zhang@123.com","li@qq.com"})
    5     public void doSome(){}
    6     @OtherAnnotation(age=25,email = "wang@wangyi.com")
    7     public void doOther(){}
    8 }

     

    六、反射注解的属性值

    注解:

    package com.bk.java.Test42;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.TYPE,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation02 {
        String Value() default "北京";
    }

    注解测试:

    package com.bk.java.Test42;
    
    @MyAnnotation02
    public class MyAnnotationTest02 {
    
        int i;
        public MyAnnotationTest02(){
        }
        @MyAnnotation02
        public void  doSome(){
            int i;
        }
    }

    测试反射注解:

     1 package com.bk.java.Test42;
     2 
     3 public class ReflectAnnotationTest02 {
     4     public static void main(String[] args) throws ClassNotFoundException {
     5         //获取类
     6         Class c= Class.forName("com.bk.java.Test42.MyAnnotationTest02");
     7         //判断是否此类是否有注解对象
     8         if(c.isAnnotationPresent(MyAnnotation02.class)){
     9             MyAnnotation02 myAnnotation02=(MyAnnotation02)c.getAnnotation(MyAnnotation02.class);
    10             System.out.println("类上的注解对象"+myAnnotation02);
    11             //获取注解对象的属性
    12             String value=myAnnotation02.Value();
    13             System.out.println(value);
    14         }
    15     }
    16 }

    查看代码运行结果:

    类上的注解对象@com.bk.java.Test42.MyAnnotation02(Value=北京)
    北京

     

    七、反射方法上的注解信息

    注解:

     1 package com.bk.java.Test42;
     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 @Target(ElementType.METHOD)
     9 @Retention(RetentionPolicy.RUNTIME)
    10 public @interface MyAnnotation03 {
    11     String username();
    12     String password();
    13 }

    注解测试:

     1 package com.bk.java.Test42;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 public class MyAnnotationTest03 {
     6     @MyAnnotation03(username="admin",password = "123")
     7     public void doSome(){};
     8 
     9     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
    10         Class c=Class.forName("com.bk.java.Test42.MyAnnotationTest03");
    11         //获取doSome方法
    12         Method doSomeMethod=c.getDeclaredMethod("doSome");
    13         //判断方法上是否有这个注解
    14         if(doSomeMethod.isAnnotationPresent(MyAnnotation03.class)){
    15             MyAnnotation03 myAnnotation03=doSomeMethod.getAnnotation(MyAnnotation03.class);
    16             System.out.println(myAnnotation03.username());
    17             System.out.println(myAnnotation03.password());
    18         }
    19     }
    20 }

    查看运行结果:

    admin
    123

     

  • 相关阅读:
    Win10设置文件夹权限报错-(提示:无法枚举容器中的对象 访问被拒绝)
    判断上传文件是否是图片文件
    PB调用C#编写的Dll类库
    C#txt文件创建并写入信息
    三十分钟学完Vue
    html增加锚点定位
    Asp.Net WebApi 调试利器“单元测试”
    ios端 返回上一级后 卡在正在加载中处理方式
    [转]如何为图片添加热点链接?(map + area)
    JS获取当前时间并格式化"yyyy-MM-dd HH:mm:ss"
  • 原文地址:https://www.cnblogs.com/mrwhite2020/p/14618456.html
Copyright © 2020-2023  润新知