java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。

1、元注解

元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种。

1.1、@Retention: 定义注解的保留策略

@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
1.2、@Target:定义注解的作用目标
其定义的源码为: 
[java] view plaincopy
  1. @Documented
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Target(ElementType.ANNOTATION_TYPE)
  4. public @interface Target {
  5. ElementType[] value();
  6. }
@Target(ElementType.TYPE)   //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR)  //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包   
由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等
1.3、@Document:说明该注解将被包含在javadoc中
1.4、@Inherited:说明子类可以继承父类中的该注解
2、java 注解的自定义
下面是自定义注解的一个例子
[java] view plaincopy
  1. @Documented
  2. @Target({ElementType.TYPE,ElementType.METHOD})
  3. @Retention(RetentionPolicy.RUNTIME)
  4. public @interface Yts {
  5. public enum YtsType{util,entity,service,model}
  6. public YtsType classType() default YtsType.util;
  7. }
[java] view plaincopy
  1. @Documented
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Target(ElementType.METHOD)
  4. @Inherited
  5. public @interface HelloWorld {
  6. public String name()default "";
  7. }

@Retention(RetentionPolicy.RUNTIME)

定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。

@Target({ElementType.TYPE,ElementType.METHOD})

因此这个注解可以是类注解,也可以是方法的注解

这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等

3 注解是定义好了,那么怎么来得到,解析注解呢?

java的反射机制可以帮助,得到注解,代码如下:

[java] view plaincopy
  1. public class ParseAnnotation {
  2. public void parseMethod(Class clazz) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException{
  3. Object obj = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{});
  4. for(Method method : clazz.getDeclaredMethods()){
  5. HelloWorld say = method.getAnnotation(HelloWorld.class);
  6. String name = "";
  7. if(say != null){
  8. name = say.name();
  9. method.invoke(obj, name);
  10. }
  11. Yts yts = (Yts)method.getAnnotation(Yts.class);
  12. if(yts != null){
  13. if(YtsType.util.equals(yts.classType())){
  14. System.out.println("this is a util method");
  15. }else{
  16. System.out.println("this is a other method");
  17. }
  18. }
  19. }
  20. }
  21. @SuppressWarnings("unchecked")
  22. public void parseType(Class clazz) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
  23. Yts yts = (Yts) clazz.getAnnotation(Yts.class);
  24. if(yts != null){
  25. if(YtsType.util.equals(yts.classType())){
  26. System.out.println("this is a util class");
  27. }else{
  28. System.out.println("this is a other class");
  29. }
  30. }
  31. }
  32. }

前一个方法是解析得到方法注解的,后一个方法是得到类注解的

以下是测试方法类

[java] view plaincopy
  1. @Yts(classType =YtsType.util)
  2. public class SayHell {
  3. @HelloWorld(name = " 小明 ")
  4. @Yts
  5. public void sayHello(String name){
  6. if(name == null || name.equals("")){
  7. System.out.println("hello world!");
  8. }else{
  9. System.out.println(name + "say hello world!");
  10. }
  11. }
  12. }
[html] view plaincopy
  1. public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {
  2. ParseAnnotation parse = new ParseAnnotation();
  3. parse.parseMethod(SayHell.class);
  4. parse.parseType(SayHell.class);
  5. }

转载于:https://www.cnblogs.com/sunson/p/3166975.html

【转】 java自定义注解相关推荐

  1. java 自定义注解_两步实现Java自定义注解

    什么是注解? 注解就是为容器提供元数据,例如@Controller 注解则是标记了该Bean需要交给Spring容器进行管理. 那么我们怎么去实现自个的注解,也就是自定义注解呢? 一.自定义一个注解( ...

  2. java自定义注解实现前后台参数校验

    其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 ...

  3. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  4. java 自定义注解实现不同对象之间的拷贝(支持大小写、驼峰转换)

    java 自定义注解实现不同对象之间的拷贝(支持大小写.驼峰转换) 1.需求 要实现两个属性名称完全不同的对象之间的拷贝.具体如下 原对象 /*** 原实体*/ @Data public class ...

  5. Java 自定义注解及使用场景

    文章目录 1 什么是注解(Annotation) 2 元注解 2.1 @Target 2.2 @Retention 2.3 @Repeatable 2.4 @Inherited 示例1 反射获取注解 ...

  6. java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...

  7. Java 自定义注解简单使用

    Java 自定义注解简单使用 文章目录 Java 自定义注解简单使用 第一步:在 pom.xml 下引入反射框架 第二步:自定义注解 第三步:写两个测试实体类 第四步:写个工具类扫描被注解的类(核心) ...

  8. springboot项目中自定义注解的使用总结、java自定义注解实战(常用注解DEMO)

    初学spring的时候使用注解总觉得使用注解很神奇,加一个注解就能实现想要的功能,很好奇,也想自己根据需要写一些自己实现的自定义注解.问题来了,自定义注解到底是什么?肯定会有人和我一样有这个疑惑,我根 ...

  9. java 自定义注解 教程_Java注解教程及自定义注解

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  10. 数据脱敏——基于Java自定义注解实现日志字段脱敏

    上文说了数据过敏主要有两个思路:第一个就是在序列化实体之前先把需要脱敏的字段进行处理,之后正常序列化:第二个就是在实体序列化的时候,对要脱敏的字段进行处理. 脱敏实现思路 这里探讨第一种方法,用基于自 ...

最新文章

  1. 【行业趋势】人工智能凭什么“教育”人
  2. Spring.NET学习笔记11——自定义对象行为(基础篇) Level 200
  3. Two-stage rotation animation is deprecated. This application should use the smoother single-stage an
  4. 详解Linux下通过yum安装Mariadb/MySQL数据库(腾讯云也适用)
  5. 深度学习“炼丹”难?三分钟带你了解国产丹炉旷视天元
  6. 学习一下spring-cloud-function中官方修复的一个问题
  7. 怎么知道自己适不适合学计算机专业,不知道自己到底适不适合学习计算机专业...
  8. 使用“微服务+云架构”轻松应对系统扩容!
  9. sql oltp_内存中的OLTP系列– SQL Server 2014上的数据迁移指南过程
  10. ASP.NET案例--新闻模块设计
  11. 打造IE6的position:fixed整理篇
  12. linux安装php7.3
  13. java编程练习题四
  14. 关于算法竞赛入门经典3.4.2思考题题目1必要的存储量的思考
  15. 安卓psp模拟器联机教程_psp模拟器联机游戏下载-psp模拟器联机对战版v1.0 安卓版 - 极光下载站...
  16. ONVIF网络摄像头(IPC)客户端开发—最简RTSP客户端实现
  17. 射频天线设计-窄带阻抗匹配电路设计
  18. Nessus插件包20220925
  19. 苹果鼠标右键怎么按_IOS13.4更新后的鼠标用途在哪?
  20. 人类赋予人工智能伦理,生物进化方向的突破是关键【南科大发言】

热门文章

  1. ArcGIS中标注之一上下标、分数等特殊形式标注(转)
  2. java map 迭代遍历_java 遍历Map的四种方式
  3. LVS原理详解以及部署
  4. java http连接_Java中通过方法创建一个http连接并请求(服务器间进行通信)
  5. vue filter对象_学习vue源码(3) 手写Vue.directive、Vue.filter、Vue.component方法
  6. 9个JavaScript小技巧:写出更简洁,高效代码
  7. 实现数组(java)
  8. 利用大数据和分析来发展业务,您准备好了吗?
  9. discuz如何去掉论坛的网页后缀名称forum.php
  10. moco 搭建接口mock环境入门