Java-了解注解及其应用
2023-09-11 14:19:44 时间
注解就是一种标记,在程序中加了注解就等于加了标记,没加,就没有标记。
2、注解有何作用?
加了注解,java编译器、开发工具或是其他程序可以通过反射技术了解你的类或各种元素是否有标记,有什么标记就做什么
样的事情。比如:子类重写父类的方法,方法上必须有@override标记;若一个方法已过时不用了,就该方法添加注
解@Deprecated,调用者反射时就明白这方法已过时
3、注解在哪标记,也就是说能为哪些元素标记?
可以在包、类、字段、方法、局部变量
二、自定义注解及其应用
1、先定义个注解类,如下代码:
public static void main(String[] args) { boolean isAnim = ZhujieTest.class.isAnnotationPresent(AnimTest.class); if(isAnim) System.out.println("it has one"); System.out.println("no have");
输出的结果是:no have ;表示该类没有找到注解标记,这是为何呢?不是在类上已经使用了注解了嘛? 回答这问题之前,我们先学习一个东西,Retention元注释类,指的是注释类型的注释要留多久。如果某个注释类型没有声明Retention元注释,则保留策略为默认的RetentionPolicy.CLASS,表示保留到编译时,运行时就会被剔除。 RetentionPolicy 是一个枚举类型,有三个值:SOURCE、CLASS 、 RUNTIME 分别对应着Java源文件、class文件、内存中的字节码 我们在重新看下上个代码,AnimTest 没有声明Retention,故保留默认的CLASS,只保留到编译时期。所以内存中加载类文件时,注解类已被清除,所以才会找不到AnimTest注解类的标记。要想在反射中能找到该标记,只要设置下注解类的保留周期,所以接着改下这个注解类
@Retention(value = RetentionPolicy.RUNTIME) //表示运行时也保留该注解类 public @interface AnimTest {
在执行代码,结果是:it has one 3、现在有个问题,就是注解类的使用范围是怎样的呢?只能在类上么? 其实有个元注释Tagert来限定范围的。Tagert 指的是注释类型所适用的程序元素的种类。如果注释类没有声明Tagert元注释,则可以适用于任何元素上,如果声明了,编译器就会强制实施指定的范围 如果要使AnimTest只作用于方法上,则在注释类声明Tagert
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD}) //限定范围,作用于方法 public @interface AnimTest {
public static void main(String[] args) { boolean isAnim = ZhujieTest.class.isAnnotationPresent(AnimTest.class); if(isAnim) System.out.println("it has one"); System.out.println("no have");
如果注释类既可以使用类上也可以作用 于方法上,只要修改为 @Target(value = {ElementType.METHOD,ElementType.TYPE}),type是表示类型 三、为注解增加各种属性 1、现在给注解类添加各种属性,类似接口形式,只提供方法
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.ANNOTATION_TYPE}) public @interface AnimTest { String color(); //字符串 int count(); //整型 int[] arr(); //数组 MetaAnnotation meta() default @MetaAnnotation("very food"); //注释类型 WeekDay day() default WeekDay.MON; //枚举类型 //注释类 public @interface MetaAnnotation { String value() default "heollo"; //提供默认值 //枚举类 public enum WeekDay { SUN,MON
import com.itcast.zhujie.AnimTest; @AnimTest (color ="red",count =1,arr=234) //这是自定义的注解,并为其属性赋值 public class ZhujieTest { * @param args @AnimTest (color ="blue",count=2,arr={3,21}) public static void main(String[] args) { //是否含有AnimTest注释标记 boolean isAnim = ZhujieTest.class.isAnnotationPresent(AnimTest.class); if(isAnim){ //获取AnimTest注释标记对象 AnimTest an = ZhujieTest.class.getAnnotation(AnimTest.class); //以下都是获取AnimTest注释标记对象的属性 System.out.println(an.color()); // red System.out.println(an.count()); //1 System.out.println(Arrays.toString(an.arr())); //[234] System.out.println(an.meta().value()); //very good System.out.println(an.day()); //MON System.out.println("it has one"); }else System.out.println("no have");
1)注释类的属性可以有String、int、数组、枚举和注解 2)注释类的属性可以设置默认值,如String color() default "red"; 3)在使用注释类时,有属性,但没默认值,这时必须要赋值,否则编译不通 过 @AnimTest (color ="blue",count=2,arr={3,21}) 4)获取类上的注释对象,用反射技术AnimTest an = ZhujieTest.class.getAnnotation(AnimTest.class); 5)获取注释上的属性,类似调用方法一样,需要带括号; 6)如果注释类只有一个属性要赋值,且属性名为value,则赋值时属性名和等号都可以省略,如:@MetaAnnotation("very food")
大数据开发基础的编程语言的Java的语言基础的注解 在Java编程中,注解(Annotation)是一种元数据,它们可以用于描述代码的特性、功能和用途。在大数据开发中,注解可以帮助程序员更好地理解代码,也可以用于实现各种技术需求,例如序列化、日志记录、权限控制等。
public static void main(String[] args) { boolean isAnim = ZhujieTest.class.isAnnotationPresent(AnimTest.class); if(isAnim) System.out.println("it has one"); System.out.println("no have");
输出的结果是:no have ;表示该类没有找到注解标记,这是为何呢?不是在类上已经使用了注解了嘛? 回答这问题之前,我们先学习一个东西,Retention元注释类,指的是注释类型的注释要留多久。如果某个注释类型没有声明Retention元注释,则保留策略为默认的RetentionPolicy.CLASS,表示保留到编译时,运行时就会被剔除。 RetentionPolicy 是一个枚举类型,有三个值:SOURCE、CLASS 、 RUNTIME 分别对应着Java源文件、class文件、内存中的字节码 我们在重新看下上个代码,AnimTest 没有声明Retention,故保留默认的CLASS,只保留到编译时期。所以内存中加载类文件时,注解类已被清除,所以才会找不到AnimTest注解类的标记。要想在反射中能找到该标记,只要设置下注解类的保留周期,所以接着改下这个注解类
@Retention(value = RetentionPolicy.RUNTIME) //表示运行时也保留该注解类 public @interface AnimTest {
在执行代码,结果是:it has one 3、现在有个问题,就是注解类的使用范围是怎样的呢?只能在类上么? 其实有个元注释Tagert来限定范围的。Tagert 指的是注释类型所适用的程序元素的种类。如果注释类没有声明Tagert元注释,则可以适用于任何元素上,如果声明了,编译器就会强制实施指定的范围 如果要使AnimTest只作用于方法上,则在注释类声明Tagert
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD}) //限定范围,作用于方法 public @interface AnimTest {
public static void main(String[] args) { boolean isAnim = ZhujieTest.class.isAnnotationPresent(AnimTest.class); if(isAnim) System.out.println("it has one"); System.out.println("no have");
如果注释类既可以使用类上也可以作用 于方法上,只要修改为 @Target(value = {ElementType.METHOD,ElementType.TYPE}),type是表示类型 三、为注解增加各种属性 1、现在给注解类添加各种属性,类似接口形式,只提供方法
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.ANNOTATION_TYPE}) public @interface AnimTest { String color(); //字符串 int count(); //整型 int[] arr(); //数组 MetaAnnotation meta() default @MetaAnnotation("very food"); //注释类型 WeekDay day() default WeekDay.MON; //枚举类型 //注释类 public @interface MetaAnnotation { String value() default "heollo"; //提供默认值 //枚举类 public enum WeekDay { SUN,MON
import com.itcast.zhujie.AnimTest; @AnimTest (color ="red",count =1,arr=234) //这是自定义的注解,并为其属性赋值 public class ZhujieTest { * @param args @AnimTest (color ="blue",count=2,arr={3,21}) public static void main(String[] args) { //是否含有AnimTest注释标记 boolean isAnim = ZhujieTest.class.isAnnotationPresent(AnimTest.class); if(isAnim){ //获取AnimTest注释标记对象 AnimTest an = ZhujieTest.class.getAnnotation(AnimTest.class); //以下都是获取AnimTest注释标记对象的属性 System.out.println(an.color()); // red System.out.println(an.count()); //1 System.out.println(Arrays.toString(an.arr())); //[234] System.out.println(an.meta().value()); //very good System.out.println(an.day()); //MON System.out.println("it has one"); }else System.out.println("no have");
1)注释类的属性可以有String、int、数组、枚举和注解 2)注释类的属性可以设置默认值,如String color() default "red"; 3)在使用注释类时,有属性,但没默认值,这时必须要赋值,否则编译不通 过 @AnimTest (color ="blue",count=2,arr={3,21}) 4)获取类上的注释对象,用反射技术AnimTest an = ZhujieTest.class.getAnnotation(AnimTest.class); 5)获取注释上的属性,类似调用方法一样,需要带括号; 6)如果注释类只有一个属性要赋值,且属性名为value,则赋值时属性名和等号都可以省略,如:@MetaAnnotation("very food")
最新内容请见作者的GitHub页:http://qaseven.github.io/
大数据开发基础的编程语言的Java的语言基础的注解 在Java编程中,注解(Annotation)是一种元数据,它们可以用于描述代码的特性、功能和用途。在大数据开发中,注解可以帮助程序员更好地理解代码,也可以用于实现各种技术需求,例如序列化、日志记录、权限控制等。
相关文章
- java虚拟机学习-触摸java常量池(13-1)
- Java 并发工具包 java.util.concurrent 用户指南
- Spring Boot JPA中java 8 的应用
- Java final修饰符
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
- 【JAVA】Eclipse中开启java和xml智能提示功能(图文,已解决!)
- Java字符编码的转化问题
- 《Groovy官方文档》1.3 Groovy和Java比较
- Java: mysql-connector-java
- JAVA基础--Java枚举+位操作,巧妙判断是否设置
- 白瞟党乐坏了!Alibaba 内部最新 Java 开发手册(嵩山版)灵魂 17 问
- Java开发环境的搭建以及使用eclipse从头一步步创建java项目
- Java面试集合(四)
- Java基础语法:1.第一个java程序
- java随笔5 完整路径的应用
- RSA加密和数字签名在Java中常见应用【原创】
- Java中泛型在集合框架中的应用
- java并发编程中Future、CompleteFuture、ForkJoin的应用
- Java程序运行超时后退出或进行其他操作的实现
- Java高手速成│实战:应用数据库和GUI开发产品销售管理软件(2)
- 自动加载,热加载java项目文件
- 【Java实验】List容器的应用
- Java小白入门200例48之 continue语句详解
- 【SQL Bugs】Caused by: java.sql.SQLSyntaxErrorException: ORA-01789: 查询块具有不正确的结果列数(原因记录)