• Java基础学习12--注解


    1.注解相关概念

    注解(Annotation)是代码里的特殊标记,程序可以读取注解,一般用于替代配置文件。

    可以通过反射技术得到类的注解,以控制类的运行方式。

    创建注解使用@interface关键字,注解中只能包含属性。

    注解的属性可以使用的类型:字符串、基本数字类型、Class、Enum、Annotation,以上类型的一维数组。

    2.创建注解

    1 package com.example.anno;
    2 
    3 public @interface MyAnnotation {
    4     //只能包含属性
    5     String name();
    6     
    7     int age() default 18;
    8 }
     1 package com.example.anno;
     2 
     3 import com.example.eum.Gender;
     4 
     5 public @interface MyAnnotation2 {
     6     String value();
     7     
     8     int num() default 2;
     9     
    10 //    Class<?> class1();
    11 //    
    12 //    Gender gender();
    13 //    
    14 //    MyAnnotation anno1();
    15 }
     1 package com.example.anno;
     2 
     3 //注解写在类上
     4 @MyAnnotation(name = "张三", age = 20)
     5 public class Person {
     6     
     7     //注解写在方法上,使用默认值
     8     @MyAnnotation(name = "张三")
     9     public void show() {
    10         
    11     }
    12     
    13     @MyAnnotation2(value="鸡肉")    
    14     public void eat() {
    15         
    16     }
    17 }

    注解的本质是一个继承了Annotation的interface,注解的属性会被转换为方法。

    3.使用反射获取注解信息

     1 package com.example.anno;
     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 //@Retention(RetentionPolicy.CLASS)// 默认,运行的时候注解就不存在了
    10 @Retention(RetentionPolicy.RUNTIME) // jvm级别
    11 //@Retention(RetentionPolicy.SOURCE) // 编译时直接丢弃
    12 
    13 @Target(value = { 
    14         ElementType.ANNOTATION_TYPE,
    15         ElementType.CONSTRUCTOR,
    16         ElementType.FIELD,
    17         ElementType.LOCAL_VARIABLE,
    18         ElementType.METHOD,
    19         ElementType.PACKAGE,
    20         ElementType.TYPE,
    21         ElementType.TYPE_PARAMETER,
    22         ElementType.TYPE_USE })
    23 
    24 public @interface PersonInfo {
    25     String name();
    26 
    27     int age();
    28 
    29     String sex();
    30 }
     1 package com.example.anno;
     2 
     3 //注解写在类上
     4 @MyAnnotation(name = "张三", age = 20)
     5 public class Person {
     6 
     7     // 注解写在方法上,使用默认值
     8     @MyAnnotation(name = "张三")
     9     public void show() {
    10 
    11     }
    12 
    13     @MyAnnotation2(value = "鸡肉")
    14     public void eat() {
    15 
    16     }
    17 
    18     @PersonInfo(name = "张三", age = 20, sex = "男")
    19     public void show(String name, int age, String sex) {
    20         System.out.println(name + "--" + age + "--" + sex);
    21     }
    22 }
     1 package com.example.anno;
     2 
     3 import java.lang.annotation.Annotation;
     4 import java.lang.reflect.Method;
     5 
     6 public class Demo {
     7 
     8     public static void main(String[] args) throws Exception {
     9         // TODO Auto-generated method stub
    10         Class<?> cp = Class.forName("com.example.anno.Person");
    11         Method m = cp.getMethod("show", String.class, int.class, String.class);
    12         PersonInfo pi = m.getAnnotation(PersonInfo.class);
    13         System.out.println(pi.name() + "--" + pi.age() + "--" + pi.sex());
    14 
    15         Person p = (Person) cp.newInstance();
    16         m.invoke(p, pi.name(), pi.age(), pi.sex());
    17     }
    18 }
  • 相关阅读:
    Java基本数据类型学习
    【异常】Docker安装elasticsearch7, 浏览使用 9200 无法打开
    docker logs-查看docker容器日志
    centos开开放防火墙
    软工超越日报-android的简单旋转效果实现 5/13
    软工超越日报-Android文件下载器 5/12
    软工超越日报-团队第一阶段冲刺十日谈回顾总结 5/11
    软工超越日报-安卓APP联网获取数据(3) 5/10
    软工超越日报-安卓APP联网获取数据(2) 5/9
    软工超越日报-安卓APP联网下载数据(1) 5/8
  • 原文地址:https://www.cnblogs.com/asenyang/p/14385978.html
Copyright © 2020-2023  润新知