详解Java进阶知识注解
作者:offer冲冲冲 发布时间:2023-08-12 13:11:37
一、注解的概念
1、注解官方解释
注解
叫元数据,一种代码级别的说明,它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举在同一个层次,它可以声明在包、类、字段、局部变量、方法参数等的前面,用来对这些元素进行说明、注释。
注解的作用分类
编写文档:通过代码里表示的元数据生成文档【生成doc文档】
代码分析:通过代码里表示的元数据进行分析【使用反射】
编译检查:通过代码里表示的元数据让编译器能够实现基本的编译检查【Override】
注解按照运行机制分类
源码注解:注解只在源码中存在,编译成.class文件之后就不存在了
编译时注解:注解在源码存在的基础上,也会在.class文件中存在,但是在运行阶段中就不存在了,例如:@Override
运行时注解:注解在运行阶段依然存在,且能够影响程序的运行过程,例如:@Autowired
2、注解与注释的区别
(1)注解:用于描述代码,说明程序,主要目的是为了给计算机看,且能够影响程序的运行。
(2)注释:用于描述代码的作用和一些关键性的知识点,使用文字描述程序,是为了给程序员观看,以此来使程序员能够以最快的时间了解被注释的代码。
二、内置注解与元注解
1、常用的内置注解
@Override:检测该注解标记的方法是否继承自父类;
@Deprecated:说明被标记的内容已过时,暗示着在不久之后可能会被更新抹除;
@SuppressWarnings:压制警告,就是被标记的部分不会产生警告,常用的参数:@SuppressWarnings(“all”);
@SafeVarargs:参数安全类型注解,它的目的就是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生unchecked这样的警告;
2、常用的元注解
元注解:用于描述注解的注解,在创建注解时使用
1. @Target属性值:
ElementType.TYPE:能修饰类、接口或枚举类型
ElementType.METHOD:能修饰方法
ElementType.FIELD: 能修饰成员变量
ElementType.PARAMETER:能修饰参数
ElementType.CONSTRUCTOR:能够修饰构造器
ElementType.ANNOTATION_TYPE:能够修饰注解
ElementType.PACKAGE:能够修饰包
ElementType.LOCAL_VARIABLE:能够修饰局部变量
2.@Retention属性值:
RetentionPolicy.SOURCE:注解只在源码中存在,编译成class之后就没了
RetentionPolicy.CLASS:注解在源码和class中都存在,运行时就没了,这个是Retention的默认值
RetentionPolicy.RUNTIME: 注解在源码、class、运行时都存在,如果要使用反射一定要定义为这种类型
3.@Documented:该注解的作用就是表示此注解标记的注解可以包含到javadoc文件中去
4.@Inherited:描述注解是否能够被子类所继承
三、自定义注解
1、自定义注解基础知识
1.格式:
@Inherited//元注解public @interface zhujie{}
2.注解本质:注解的本质上就是一个接口,该接口默认继承Annotation
public interface MyAnno extends java.lang.annotation.Annotion
3.属性:接口中可以定义的内容(成员方法、抽象方法)
属性的返回值:
八种基本数据类型
字符串类、接口、枚举
注解
以上类型的数组
属性赋值注意事项
如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,就可以不进行属性的赋值,否则都必须给属性赋值
如果只有一个属性需要赋值的话,并且属性的名称是value,则使用注解给属性赋值时,value可以省略,直接定义值就可以了
数组赋值时,值需要使用{}包裹,如果数组中只有一个值,则{}可以省略不写
2、演示自定义注解的使用
自定义注解annotation
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
public @interface annotation {
String name() default "木鱼";
int age();
int[] score();
}
使用以上注解的类TestAnnotation
//name具有默认值,不需要必须为name赋值,但也可以重新赋值
@annotation(age=20,score={99,100,100})
public class TestAnnotation {
public static void main(String[] args) throws ClassNotFoundException {
Class clazz = Class.forName("test.TestAnnotation");
annotation annotation = (annotation) clazz.getAnnotation(annotation.class);
System.out.println("姓名:"+annotation.name()+" 年龄:"+annotation.age());
System.out.print("成绩为:");
int[] score=annotation.score();
for (int score1:score){
System.out.print(score1+" ");
}
}
}
运行结果
3、演示注解在程序中的作用
两个方法:
类对象调用
isAnnotationPresent(Class<? extends Annotation> annotationClass)
判断是否应用了某个注解通过getAnnotation()方法获取Annotation对象,或者getAnnotations()方法获取所有应用在该类上的注解
1.创建自定义注解
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
public @interface StringNull {
}
2.创建实体类
public class Student {
@StringNull
public String name=null;
@StringNull
public String xuehao=null;
@StringNull
public String sex=null;
public void setName(String name) {
this.name = name;
}
public void setXuehao(String xuehao) {
this.xuehao = xuehao;
}
public void setSex(String sex) {
this.sex = sex;
}
}
3.创建测试类,测试注解
public class TestAnnotation {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("test.Student");
Student student =(Student) clazz.newInstance();
student.setName("小明");
Field[] fields= clazz.getFields();
for(Field f:fields){
if(f.isAnnotationPresent(StringNull.class)){
if(f.get(student)==null){
System.out.println(f.getName()+":是空的字符串属性");
}else{
System.out.println(f.getName()+":"+f.get(student));
}
}
}
}
}
4.运行结果
来源:https://blog.csdn.net/mydesss/article/details/115604708
猜你喜欢
- 问题描述Feign 在请求时是不会将 request 的请求头带着请求的,导致假如 Feign 调用的接口需要请求头的信息,比如当前用户的
- 前言当初年少懵懂,那年夏天填志愿选专业,父母听其他长辈说选择计算机专业好。从那以后,我的身上就有了计院深深的烙印。从寝室到机房,从机房到图书
- 本文实例为大家分享了JAVA NIO实现简单聊天室功能的具体代码,供大家参考,具体内容如下服务端初始化一个ServerSocketChann
- 相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线void fitLine( InputArray points, Output
- 背景前段时间同事碰到一个问题,需要在 SpringCloud 的 Feign 调用中使用自定义的 URL;通常情况下是没有这个需求的;毕竟都
- 最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows
- Mybatis Plus select 查询部分字段Mybatis Plus select语句默认查询所有字段,如需要指定字段查询,则需使用
- 前言回想一下,在学Java时接触的正则表达式,其实Kotlin中也是类似。只不过使用Kotlin 的语法来表达,更为简洁。正则(Regex)
- 前言在网络通信中,通信传输数据容易被截取或篡改,如果在传输用户隐私数据过程中,被不法分子截取或篡改,就可能导致用户受到伤害,比如被诈 骗,所
- Java中为什么需要Callable在java中有两种创建线程的方法:一种是继承Thread类,重写run方法:public class T
- 前言最近在改进项目的并发功能,但开发起来磕磕碰碰的。看了好多资料,总算加深了认识。于是打算配合查看源代码,总结并发编程的原理。准备从用得最多
- 1.强引用( Strong Reference )最普遍的引用:Object obj=new Object()抛出OutOfMemoryEr
- Java 2D API通过扩展抽象窗口工具箱(AWT),为Java程序提供了二维图像,文本和图形的功能。这个复杂的渲染包支持线形图像,文本和
- 一、Rxjava使用场景为了模拟实际场景,从wanandroid网站找了二个接口,如下:(对Wanandroid表示感谢!)public i
- pom.xml文件需要的内容<dependency> <groupId>re
- Java并发包的locks包里的锁基本上已经介绍得差不多了,ReentrantLock重入锁是个关键,在清楚的了解了同步器AQS的运行机制后
- 目录1. SpringCloud特点2. 分布式系统的三个指标CAP3. Eureka4. SpringCloud Demo4.1 regi
- 一、二叉搜索树插入元素/** * user:ypc; * date:2021-05-18; * time: 15:09; */
- 一.什么是SemaphoreSemaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueu
- 1、理论一般如果想将类注册到spring容器,让spring来完成实例化,常用方式如下:xml中通过bean节点来配置;使用@Service