`
y806839048
  • 浏览: 1126745 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java中自定义注解并通过反射获取注解属性值

阅读更多

直接上代码,注释中有说明:

1、定义自定义注解类(类注解和字段注解):

  1. package com.uno.ray;  
  2.   
  3. import java.lang.annotation.Documented;  
  4. import java.lang.annotation.ElementType;  
  5. import java.lang.annotation.Inherited;  
  6. import java.lang.annotation.Retention;  
  7. import java.lang.annotation.RetentionPolicy;  
  8. import java.lang.annotation.Target;  
  9. import java.net.Authenticator.RequestorType;  
  10.   
  11. /** 
  12.  * 自定义注解 
  13.  * @author Uno 
  14.  *@Documented:指明该注解可以用于生成doc 
  15.  *@Inherited:该注解可以被自动继承 
  16.  *@Retention:指明在什么级别显示该注解: 
  17.  *  RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃 
  18.     RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略 
  19.     RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中 
  20.   @Target:指明该注解可以注解的程序范围 
  21.     ElementType.TYPE 用于类,接口,枚举但不能是注解 
  22.     ElementType.FIELD 作用于字段,包含枚举值 
  23.     ElementType.METHOD 作用于方法,不包含构造方法 
  24.     ElementType.PARAMETER 作用于方法的参数 
  25.     ElementType.CONSTRUCTOR 作用于构造方法 
  26.     ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句 
  27.     ElementType.ANNOTATION_TYPE 作用于注解 
  28.     ElementType.PACKAGE 作用于包 
  29.  */  
  30. @Documented  
  31. @Inherited  
  32. @Retention(RetentionPolicy.RUNTIME)  
  33. @Target({ElementType.TYPE, ElementType.FIELD})//次注解作用于类和字段上  
  34. public @interface FieldTypeAnnotation {  
  35.     /** 
  36.      *leip 2016年12月3日 
  37.      *TODO 
  38.     **/  
  39.     String type() default "ignore";  
  40.     int age() default 27;  
  41.     String[] hobby(); //没有指定defalut的,需要在注解的时候显式指明  
  42. }  

2、(方法注解)

 

 

  1. package com.uno.ray;  
  2.   
  3. import java.lang.annotation.Documented;  
  4. import java.lang.annotation.ElementType;  
  5. import java.lang.annotation.Inherited;  
  6. import java.lang.annotation.Retention;  
  7. import java.lang.annotation.RetentionPolicy;  
  8. import java.lang.annotation.Target;  
  9.   
  10. /** 
  11.  *  
  12.  * @author Uno 
  13.  * 
  14.  */  
  15. @Documented  
  16. @Inherited  
  17. @Retention(RetentionPolicy.RUNTIME)  
  18. @Target(ElementType.METHOD) //次注解只能作用于方法上  
  19. public @interface MethodAnnotation {  
  20.   
  21.     String desc() default "method1";  
  22. }  


3、定义测试类:(反射类)

 

 

  1. package com.uno.ray;  
  2.   
  3. import java.awt.Dialog.ModalityType;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Method;  
  6. import java.util.Arrays;  
  7.   
  8. @FieldTypeAnnotation(type = "class", hobby = { "smoke" })  
  9. public class ReflectAnnotation {  
  10.     /** 
  11.      * leip 2016年12月3日 TODO 
  12.      **/  
  13.     @FieldTypeAnnotation(hobby = { "sleep", "play" })  
  14.     private String maomao;  
  15.   
  16.     @FieldTypeAnnotation(hobby = { "phone", "buy" }, age = 27, type = "normal")  
  17.     private String zhangwenping;  
  18.       
  19.     @MethodAnnotation()  
  20.     public void method1() {  
  21.           
  22.     }  
  23.     @MethodAnnotation(desc="method2")  
  24.     public void method2() {  
  25.           
  26.     }  
  27.   
  28.     public static void main(String[] args) {  
  29.         // 此处要用反射将字段中的注解解析出来  
  30.         Class<ReflectAnnotation> clz = ReflectAnnotation.class;  
  31.         // 判断类上是否有次注解  
  32.         boolean clzHasAnno = clz.isAnnotationPresent(FieldTypeAnnotation.class);  
  33.         if (clzHasAnno) {  
  34.             // 获取类上的注解  
  35.             FieldTypeAnnotation annotation = clz.getAnnotation(FieldTypeAnnotation.class);  
  36.             // 输出注解上的属性  
  37.             int age = annotation.age();  
  38.             String[] hobby = annotation.hobby();  
  39.             String type = annotation.type();  
  40.             System.out.println(clz.getName() + " age = " + age + ", hobby = " + Arrays.asList(hobby).toString() + " type = " + type);  
  41.         }  
  42.         // 解析字段上是否有注解  
  43.         // ps:getDeclaredFields会返回类所有声明的字段,包括private、protected、public,但是不包括父类的  
  44.         // getFields:则会返回包括父类的所有的public字段,和getMethods()一样  
  45.         Field[] fields = clz.getDeclaredFields();  
  46.         for(Field field : fields){  
  47.             boolean fieldHasAnno = field.isAnnotationPresent(FieldTypeAnnotation.class);  
  48.             if(fieldHasAnno){  
  49.                 FieldTypeAnnotation fieldAnno = field.getAnnotation(FieldTypeAnnotation.class);  
  50.                 //输出注解属性  
  51.                 int age = fieldAnno.age();  
  52.                 String[] hobby = fieldAnno.hobby();  
  53.                 String type = fieldAnno.type();  
  54.                 System.out.println(field.getName() + " age = " + age + ", hobby = " + Arrays.asList(hobby).toString() + " type = " + type);  
  55.             }  
  56.         }  
  57.         //解析方法上的注解  
  58.         Method[] methods = clz.getDeclaredMethods();  
  59.         for(Method method : methods){  
  60.             boolean methodHasAnno = method.isAnnotationPresent(MethodAnnotation.class);  
  61.             if(methodHasAnno){  
  62.                 //得到注解  
  63.                 MethodAnnotation methodAnno = method.getAnnotation(MethodAnnotation.class);  
  64.                 //输出注解属性  
  65.                 String desc = methodAnno.desc();  
  66.                 System.out.println(method.getName() + " desc = " + desc);  
  67.             }  
  68.         }  
  69.     }  
  70. }  


4、输出

 

  1. com.uno.ray.ReflectAnnotation age = 27, hobby = [smoke] type = class  
  2. maomao age = 27, hobby = [sleep, play] type = ignore  
  3. zhangwenping age = 27, hobby = [phone, buy] type = normal  
  4. method2 desc = method2  
  5. method1 desc = method1  
分享到:
评论

相关推荐

    springboot工程自定义response注解、自定义规范化返回数据结构

    本主题将深入探讨如何在Spring Boot工程中通过自定义response注解、利用Java反射机制、设置自定义拦截器以及实现WebMvcConfigurer接口来实现这一目标。 首先,我们来看自定义response注解。在Spring Boot中,可以...

    Java Bean 遍历和使用注解给Bean的属性添加属性值

    - **运行时反射**:除了编译时处理,还可以在运行时通过反射获取注解的值,如`MyAnnotation myAnno = field.getAnnotation(MyAnnotation.class); String value = myAnno.value();` 3. **工具支持**: - **Apache ...

    java自定义注解\标签库\监听\junit简单测试

    Java自定义注解是Java平台提供的一种元编程机制,它允许程序员在源代码中的任何元素(类、方法、变量等)上添加元数据。自定义注解可以被编译器或者运行时系统用来执行特定的任务,例如代码分析、性能监控、持久化...

    Java反射动态修改注解的某个属性值.Java

    本文将深入探讨如何通过Java反射来动态修改注解的某个属性值。 首先,了解注解的基本结构。注解是由`@`符号开始,后面跟着注解的名称和一组键值对组成的。例如,自定义注解`@MyAnnotation(name="test")`,其中`name...

    自定义注解使用

    在Java编程语言中,自定义注解(Custom Annotation)是一种元数据,允许程序员在代码中添加额外的信息,这些信息可以在编译时或运行时被工具或JVM读取和处理。自定义注解使得代码更加模块化,可读性更强,并且能够...

    注解反射导出Excel自定义中文表头

    4. **反射处理**: 遍历DataModel类的所有字段,通过反射获取带有`@ExcelHeader`注解的字段,提取其注解中的name属性作为表头名称。 5. **创建Excel**: 使用Apache POI或JXLS等库创建Excel工作簿,设置表头和数据。...

    java注解之运行时修改字段的注解值操作

    在上面的代码中,我们使用了 Java 的反射机制来获取注解的值。 结论 Java 注解之运行时修改字段的注解值操作是非常有用的技术,可以帮助我们在实际开发中更方便地处理和修改代码。本文主要介绍了 Java 注解之运行...

    JAVA反射机制自定义框架测试代码

    本篇文章将深入探讨Java反射机制,并通过自定义框架的测试代码来进一步理解其应用。 首先,我们需要了解什么是反射。在Java中,反射是指在运行时,程序可以获取类、接口、字段和方法的信息,并且能够调用这些方法,...

    运用注解改变反射之后类属性的顺序

    然而,当我们通过反射获取类的属性时,可能会遇到一个常见的问题:属性的顺序并不总是按照我们期望的方式呈现。默认情况下,Java反射API(如`Field[] getDeclaredFields()`方法)返回的字段数组顺序与它们在源代码中...

    java注解和反射的12个demo.zip

    在Java中,注解(Annotation)是一种元数据,它提供了将信息附加到代码(类、方法、变量等)的方式,而反射则允许我们在运行时检查类、接口、字段和方法的属性,并能动态调用方法或访问字段。 注解的作用主要有以下...

    详解Java注解教程及自定义注解

    例如,你可以检查一个类、方法或字段是否被特定的注解标记,并获取注解的值。以下是一个简单的示例: ```java Method method = MyClass.class.getMethod("myMethod"); MethodInfo methodInfo = method....

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    servlet反射注解例子

    然后,通过反射获取注解的值,并根据这些信息注册Servlet。这使得我们的代码更加模块化,也便于使用依赖注入和其他高级功能。 此外,我们还可以使用`java.lang.reflect`包中的类,如`Class`、`Method`和`Field`,在...

    反射和自定义特性DEMO

    下面我们将深入探讨这两个概念,并通过一个案例来展示它们的使用。 首先,让我们理解反射的概念。反射允许程序动态地获取关于类型、方法、属性等信息,并能在运行时创建和调用对象。在C#中,`System.Reflection`...

    Java反射、泛型和注解实战之Spring核心注入IOC的实现

    1. 定义注解:首先,创建自定义注解来标识需要注入的属性,如`@InjectDependency`。 2. 创建扫描器:编写一个类来扫描所有带有注解的类,收集这些类的信息,包括类名、字段名和注解。 3. 实现注入逻辑:创建一个类或...

    java中的注解

    属性值可以通过反射API访问,如`annotationInstance.value()`。 4. **元注解** - **元注解**是对注解的注解,提供了关于注解如何使用的附加信息。例如: - **@Retention**:控制注解的生命周期,是只在源代码中...

    一种基于Java注解和反射机制的Excel文件读写操作方法.zip

    2. 创建一个读取方法,遍历类的字段,通过反射获取`@ExcelColumn`注解,然后从Excel文件的相应列读取数据并填充到对象中。 3. 创建一个写入方法,反向操作,遍历对象的所有字段,根据注解找到对应的列,将数据写入...

    注解反射生成SQL语句

    在Java中,我们可以通过定义自定义注解来标记类、方法、字段等,然后通过处理器或反射机制来解析这些注解并采取相应行动。 例如,我们可以创建一个`@Table`注解来标识一个类代表数据库中的表,一个`@Column`注解来...

Global site tag (gtag.js) - Google Analytics