19_注解

文章目录

  • 注解
    • 注解的作用
    • 注解的语法
    • 注解的使用
  • 元注解
  • 注解处理器
    • 案例
  • 注解VS配置文件
  • 注解的应用

注解

  • Annotation是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理
  • 可以把Annotation理解为一个标签
  • 注解是不允许继承

注解的作用

  • 通过使用Annotation,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充信息
  • Annotation就像修饰符一样被使用,可用于修饰构造器方法成员变量参数…,这些信息被存储在Annotation的“属性名=属性值”对中。

注解 VS 注释

  • 相同点
    • 都是用来传递额外信息的
  • 不同点
    • 注解可以参与编译,注释不行
    • 注解有使用范围,注释没有(想咋写咋写)
    • 注解作为一种数据类型,跟class interface具有同等地位

注解的语法

权限修饰符 @interface 注解名字{// 注解体定义属性类型 属性名();属性类型 属性名();属性类型 属性名();......
}属性类型:
基本数据类型
String类型
Class类型
注解类型
枚举类型
以及以上类型的数组形式

eg:

public @interface MyAnnotation {int a1();double a2();String a3();Class a4();MyAnnotation2 a5();String[] str();Season a6();
}@interface MyAnnotation2{}enum Season{SPRING,SUMMER,AUTUMN,WINTER
}

注解的使用

@注解名(属性1=属性值,属性2=属性值)

注意事项:

  • 每个属性都要赋值

  • 可以不赋值,但是要有默认值, default

  • 数组形式赋值 {}

  • 如果只有1个属性, 名字叫value, 可以简化赋值

  • 如果属性类型是引用类型, 不能是null

eg:


public class Demo {public static void main(String[] args) {}@MyAnno0(hobby = {"football", "basketball", "tennis"})@MyAnno1("zs")public static void func() {}
}@interface MyAnno0 {// 注解体int age() default 0;String name() default "zs";String[] hobby();
}@interface MyAnno1 {// 注解体String value();
}

元注解

  • 描述注解的注解(注解的注解)
  • 元数据 meta data

常用元注解:

  • @Retention元注解,来定义我们自己定义的注解的保留级别

    • RetentionPolicy.RUNTIME

    • RetentionPolicy.CLASS 默认

    • RetentionPolicy.SOURCE

  • @Target元注解,注解可以作用的目标

    • 对于注解而言,可以作用的目标:

        1. 整个类 ElementType.TYPE
        1. 成员变量 ElementType.FIELD
        1. 构造方法 ElementType.CONSTRUCTOR
        1. 成员方法 ElementType.METHOD

eg:

在这里插入图片描述


注解处理器

eg:


public class Demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {// 获取字节码文件对象Class<?> c = Class.forName("com.csdn.Demo");// 得到方法对象Method loginMethod = c.getDeclaredMethod("login");// 判断方法上面是否使用注解了boolean annotationPresent = loginMethod.isAnnotationPresent(Login.class);if(annotationPresent){// 获取注解实例Login loginAnnotation = loginMethod.getAnnotation(Login.class);// 获取注解信息String password = loginAnnotation.password();String name = loginAnnotation.name();// 打印System.out.println("password = " + password);System.out.println("name = " + name);}else{System.out.println("未使用注解");}}@Loginpublic static void login(){}
}// 定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Login{// 属性值String name() default "admin";String password() default "admin";
}

案例

定义2个注解 :

  • AgeLimit 属性 maxAge minAge

  • NameLimit 属性 length

定义学生类Student 年龄18-25之间 名字长度不超过5

eg:


StudentFactory自己定义的类:
public class StudentFactory {static Class studentUtils;static {try {studentUtils = Class.forName("com.cskaoyan.Demo0112.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}}// 提供一个获取学生对象的方法public static Student getInstance(String name, int age)throws NoSuchFieldException, NoSuchMethodException,InvocationTargetException,InstantiationException, IllegalAccessException {// 通过字节码文件获取对象// 判断名字judgeName(name);// 判断年龄judgeAge(age);// 获取构造方法Constructor declaredConstructor = studentUtils.getDeclaredConstructor(String.class, int.class);// 破解declaredConstructor.setAccessible(true);// newInstance 创建对象Student student = (Student) declaredConstructor.newInstance(name, age);// 最终返回一个学生对象return student;}private static void judgeAge(int age) throws NoSuchFieldException {// 获取age成员变量对象Field ageField = studentUtils.getDeclaredField("age");// 是否使用注解boolean annotationPresent = ageField.isAnnotationPresent(AgeLimit.class);if (annotationPresent) {// 获取注解实例AgeLimit ageLimit = ageField.getAnnotation(AgeLimit.class);// 拿到注解信息int min = ageLimit.minAge();int max = ageLimit.maxAge();// 是否在范围内if (age < min || age > max) {throw new IllegalArgumentException("age is illegal");}}}private static void judgeName(String name) throws NoSuchFieldException {// 获取name成员变量Field nameField = studentUtils.getDeclaredField("name");// 是否使用注解boolean annotationPresent = nameField.isAnnotationPresent(NameLimit.class);if (annotationPresent) {// 获取注解实例NameLimit namelimit = nameField.getAnnotation(NameLimit.class);// 拿到注解信息int length = namelimit.length();// 是否在范围内if (name.length() > length) {throw new IllegalArgumentException("name is illegal");}}}
}main函数:
public class Demo {public static void main(String[] args)throws NoSuchFieldException, InvocationTargetException,NoSuchMethodException, InstantiationException,IllegalAccessException {StudentFactory.getInstance("zs",18);StudentFactory.getInstance("ww",1);}
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface AgeLimit{int maxAge() default 25;int minAge() default 18;
}@interface NameLimit{int length();
}class Student{@NameLimit(length = 5)String name;@AgeLimitint age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

注解VS配置文件

配置文件
优点:可配置,不用改源码。管理方便
缺点:不直观,开发效率低

注解
优点:直观开发效率高
缺点:硬编码,修改之后需要重新编译运行,难以和代码分开独立管理

注解的应用

SE :

  • @Test
  • @Override(提供一个额外的信息,方法是重写父类中的方法)
  • @Deprecated(提供一个额外的信息,方法过时了)
  • @FunctionalInterface

EE :

  • @WebService

框架

  • @AutoWired
  • @Service
  • @Mapping
  • @Data
  • @Parm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343251.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浏览器深色模式

1、Edge强制深色模式 1、先在edge里设定成深色模式 设置浏览器中的深色设置 但这种方式设置后很多网站仍是白色的背景 2、实验室设置强制深色 网址栏 输入 edge://flags搜索 dark 选择 enabled 重启 2、Chrome强制深色模式 浏览器输入 Chrome深色设置 chrome://flags/#…

中国信通院联合发布《数字孪生城市白皮书(2023年)》

2017年“数字孪生城市”概念被首次提出&#xff0c;2021年我国“十四五”规划纲要明确“探索建设数字孪生城市”&#xff0c;2023年《数字中国建设整体布局规划》再次提出“全面提升数字中国建设的整体性、系统性、协同性”以及“探索建设数字孪生城市”等要求。数字孪生城市建…

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始&#xff0c;新电脑或者新系统开机之后都会出现一个界面让你创建一个账户&#xff0c;但这个账户有可能是本地账户&#xff08;Windows10&#xff09;还有强制你登录微软账户的&#xff08;Windows11&#xff09;。 好像曾经熟悉的电脑Administrator…

Qt QTableWidget表格控件

文章目录 1 属性和方法1.1 行列数目和行表头和列表头1.2 单元格1.3 隔行交替背景色1.4 选择模式和选择行为1.5 设置样式表 2 实例2.1 布局2.2 代码实现 QTableWidget是Qt中的表格控件。 1 属性和方法 QTableWidget有很多属性和方法&#xff0c;完整的可查看帮助文档。 在窗口…

yapi无法注册解决,使用yapi pro即可注册,接口文档生成,java,json

1.气屎我了&#xff0c;直接用yapi pro就可以用&#xff0c;害的我弄了半天 2.地址&#xff1a;https://yapi.pro/login 3.yapi pro比较卡顿。开启无痕模式轻松解决该问题&#xff08;手动狗头&#xff09;祝你开启新大陆 yapi pro yapi

(1)(1.13) SiK无线电高级配置(六)

文章目录 前言 15 使用FTDI转USB调试线配置SiK无线电设备 16 强制启动加载程序模式 17 名词解释 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 15 使用FTDI转USB调试线配置SiK无线…

element + table 行列合并

如图&#xff0c;实现通过判断数据&#xff0c;动态的合并列数据 <template><div class"merge-cell"><el-table:data"tableData":span-method"objectSpanMethod"borderstyle"width: 100%; margin-top: 20px"><e…

Windows压缩包的MySQL安装方式

1.下载压缩包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.35-winx64.zip 2.解压压缩包&#xff08;建议将解压到非C盘&#xff0c;路径不要出现特殊符号&#xff09; 3.在MySQL主目录下&#xff0c;创建my.ini空文件&#xff08;先创建一个txt文件&#xff0c;进…

nginx本地打开vue打包项目

1&#xff0c;首先下载nginx包&#xff0c;然后修改下载的包中的nginx.conf配置文件 其中location后面接的是要增加的域名字段(perbank8)&#xff0c;配置项 index index.html 代表入口文件是index.html 这个在vue项目中也要在nginx配置文件中也要配置同样的路径 在vue项目里…

Oracle 19c OCP 1z0 082考场真题解析第32题

考试科目&#xff1a;1Z0-083 考试题量&#xff1a;85 通过分数&#xff1a;57% 考试时间&#xff1a;150min本文为云贝教育郭一军&#xff08;微信&#xff1a;guoyJoe&#xff09;原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎…

在线旅游2024:新旧交锋,暗流涌动

旅游热带来的泼天富贵&#xff0c;还在继续传递。 2023年大火的“烧烤之都”淄博曾是最大受益者&#xff0c;小烧烤风靡整个夏天。最近的哈尔滨凭借冰雪和异域特色一举成为新晋“网红旅游城市”&#xff0c;元旦假期的游客接待量和旅游总收入双双达到历史峰值。 “网红城市”…

Abaqus2023安装下载教程

用钢铁意志&#xff0c;成就不平凡的人生。 今天博主整理了一下Abaqus2023安装下载教程&#xff0c;希望大家学习。 安装之前请关闭电脑所有杀毒软件和防火墙&#xff0c;并保证计算机名不是中文&#xff01;&#xff01;&#xff01;&#xff01; 1.首先创建一个用于Abaqus…