发布于2021-03-13 14:08 阅读(1506) 评论(0) 点赞(10) 收藏(3)
参考:
https://blog.csdn.net/zt15732625878/article/details/100061528
http://www.shixinke.com/java/java-annotation-usage
上一篇文章介绍了注解的一些基本知识,这次来介绍下如何实现自定义注解及注解如何使用。
注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
注解的基本元素
声明一个注解要用到的东西
访问修饰符必须为public,不写默认为pubic;
关键字为@interface;
注解名称为自定义注解的名称,使用时还会用到;
注解类型元素是注解中内容,可以理解成自定义接口的实现部分;
- public @interface Info {
- String value() default "tracy";
- boolean isDelete();
- }
JDK中有一些元注解,主要有@Target,@Retention,@Document,@Inherited用来修饰注解。
@Target
表明该注解可以应用的java元素类型
@Retention
表明该注解的生命周期
@Document
表明该注解标记的元素可以被Javadoc 或类似的工具文档化
@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解
注:注解只是一种标记,如果不解析,它是不会实现任何功能的
定义标记需要使用元注解
- package main.java.com.shixinke.java.demo.annotation;
- import java.lang.annotation.*;
- @Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- @Inherited
- @Documented
- public @interface Check {
- boolean value() default false;
- }
注:自定义注解本质上是继承自Annotation的类
(2)标记注解:打标,表明此处要使用此标记
定义一个User类,标记为@Check
- package main.java.com.shixinke.java.demo.annotation;
- @Check(true)
- public class User {
- }
定义一个Person类,不标记
- package main.java.com.shixinke.java.demo.annotation;
- public class Person {
- }
(3)解析注解:扫描标记,实现功能
一般通过反射来实现扫描注解,并在解析器中实现功能:
那么注解我们写好了,具体怎么用呢?
1. isAnnotationPresent(annotation.class):判断该程序元素上是否包含指定类型的注解
2. getAnnotations():返回该程序元素上存在的所有注解。
3. getDeclaredAnnotations():返回直接存在于此元素上的所有注释。
- package main.java.com.shixinke.java.demo.annotation;
- import java.lang.annotation.Annotation;
-
- public class CheckParser {
- public void parse(Class cls) {
-
- //判断注解是否生效
- if (cls.isAnnotationPresent(Check.class)) {
- //获取Check的注解对象
- Annotation annotation = cls.getAnnotation(Check.class);
- Check check = (Check) annotation;
- System.out.println(cls.getName() + "在检查中........");
- }
- }
- }
- package main.java.com.shixinke.java.demo.annotation;
-
- public class AnnotationDemo {
- public static void main(String[] args) {
- User user = new User();
- Person person = new Person();
- CheckParser parser = new CheckParser();
- parser.parse(user.getClass());
- parser.parse(person.getClass());
- }
- }
运行结果:
//main.java.com.shixinke.java.demo.annotation.User在检查中........
对于一个类或者接口来说,Class类(java.lang包下)中提供了一些方法用于反射注解,当然对于字段、方法来说反射注解的方式很类似。
- //返回指定的注解
- getAnnotation
- //判断当前元素是否被指定注解修饰
- isAnnotationPresent
- //返回所有的注解
- getAnnotations
可以再看一个demo:
- package com.fruit;
-
- import java.lang.annotation.*;
-
- /**
- * 水果名称注解
- * @author peida
- *
- */
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface FruitName {
- String value() default "";
- }
- package com.fruit;
-
- import java.lang.annotation.*;
-
- /**
- * 水果颜色注解
- * @author peida
- *
- */
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface FruitColor {
- /**
- * 颜色枚举
- * @author peida
- *
- */
- public enum Color{ BULE,RED,GREEN};
-
- /**
- * 颜色属性
- * @return
- */
- Color fruitColor() default Color.GREEN;
-
- }
- package com.fruit;
-
- import java.lang.annotation.*;
- /**
- * 水果供应者注解
- * @author peida
- *
- */
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface FruitProvider {
- /**
- * 供应商编号
- * @return
- */
- public int id() default -1;
-
- /**
- * 供应商名称
- * @return
- */
- public String name() default "";
-
- /**
- * 供应商地址
- * @return
- */
- public String address() default "";
- }
-
- package com.fruit;
-
- /***********注解使用***************/
-
- public class Apple {
-
- @FruitName("Apple")
- private String appleName;
-
- @FruitColor(fruitColor= FruitColor.Color.RED)
- private String appleColor;
-
- @FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")
- private String appleProvider;
-
- public void setAppleColor(String appleColor) {
- this.appleColor = appleColor;
- }
- public String getAppleColor() {
- return appleColor;
- }
-
- public void setAppleName(String appleName) {
- this.appleName = appleName;
- }
- public String getAppleName() {
- return appleName;
- }
-
- public void setAppleProvider(String appleProvider) {
- this.appleProvider = appleProvider;
- }
- public String getAppleProvider() {
- return appleProvider;
- }
-
- public void displayName(){
- System.out.println("水果的名字是:苹果");
- }
- }
- package com.fruit;
-
- /***********注解使用***************/
-
- public class Apple {
-
- @FruitName("Apple")
- private String appleName;
-
- @FruitColor(fruitColor= FruitColor.Color.RED)
- private String appleColor;
-
- @FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")
- private String appleProvider;
-
- public void setAppleColor(String appleColor) {
- this.appleColor = appleColor;
- }
- public String getAppleColor() {
- return appleColor;
- }
-
- public void setAppleName(String appleName) {
- this.appleName = appleName;
- }
- public String getAppleName() {
- return appleName;
- }
-
- public void setAppleProvider(String appleProvider) {
- this.appleProvider = appleProvider;
- }
- public String getAppleProvider() {
- return appleProvider;
- }
-
- public void displayName(){
- System.out.println("水果的名字是:苹果");
- }
- }
console:
另一个demo:
- package com.company;
-
- import java.lang.annotation.*;
-
- @Target({ElementType.FIELD, ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface Info {
- String value() default "Info的String";
- boolean isDelete();
- }
- package com.company;
-
- import lombok.Builder;
- import lombok.Data;
-
- @Data
- @Builder
- // 为Person类配置了刚刚定义的注解@Info
- @Info(isDelete = true)
- public class Person {
-
- //姓名
- private String name;
-
- //年龄
- private int age;
-
- //是否有效
- private boolean isDelete;
- }
- package com.company;
-
-
- public class AnnotationTest {
- public static void main(String[] args) {
- try {
- //获取Person的Class对象,这里是使用lombok的@builder注解
- Person person = Person.builder().build();
- Class clazz = person.getClass();
-
- //判断person对象上是否有Info注解
- if (clazz.isAnnotationPresent(Info.class)) {
- System.out.println("Person类上配置了Info注解!");
-
- //获取该对象上Info类型的注解
- Info infoAnno = (Info) clazz.getAnnotation(Info.class);
- System.out.println("person.name :" + infoAnno.value() + ",person.isDelete:" + infoAnno.isDelete());
-
- } else {
- System.out.println("Person类上没有配置Info注解!");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
console:
总结:写完注解以后调用注解解析器,即判断注解是否生效以及调用注解的参数
1. isAnnotationPresent(annotation.class):判断该程序元素上是否包含指定类型的注解。
2. getAnnotations():返回该程序元素上存在的所有注解。
3. getDeclaredAnnotations():返回直接存在于此元素上的所有注释。(根据是否需要)
作者:咿呀咿呀哟
链接:http://www.javaheidong.com/blog/article/114330/70a2e993ddf0b1545410/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!