直接上代码,注释中有说明:
1、定义自定义注解类(类注解和字段注解):
- package com.uno.ray;
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Inherited;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- import java.net.Authenticator.RequestorType;
- /**
- * 自定义注解
- * @author Uno
- *@Documented:指明该注解可以用于生成doc
- *@Inherited:该注解可以被自动继承
- *@Retention:指明在什么级别显示该注解:
- * RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃
- RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略
- RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中
- @Target:指明该注解可以注解的程序范围
- ElementType.TYPE 用于类,接口,枚举但不能是注解
- ElementType.FIELD 作用于字段,包含枚举值
- ElementType.METHOD 作用于方法,不包含构造方法
- ElementType.PARAMETER 作用于方法的参数
- ElementType.CONSTRUCTOR 作用于构造方法
- ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句
- ElementType.ANNOTATION_TYPE 作用于注解
- ElementType.PACKAGE 作用于包
- */
- @Documented
- @Inherited
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.TYPE, ElementType.FIELD})//次注解作用于类和字段上
- public @interface FieldTypeAnnotation {
- /**
- *leip 2016年12月3日
- *TODO
- **/
- String type() default "ignore";
- int age() default 27;
- String[] hobby(); //没有指定defalut的,需要在注解的时候显式指明
- }
2、(方法注解)
- package com.uno.ray;
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Inherited;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- *
- * @author Uno
- *
- */
- @Documented
- @Inherited
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD) //次注解只能作用于方法上
- public @interface MethodAnnotation {
- String desc() default "method1";
- }
3、定义测试类:(反射类)
- package com.uno.ray;
- import java.awt.Dialog.ModalityType;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.util.Arrays;
- @FieldTypeAnnotation(type = "class", hobby = { "smoke" })
- public class ReflectAnnotation {
- /**
- * leip 2016年12月3日 TODO
- **/
- @FieldTypeAnnotation(hobby = { "sleep", "play" })
- private String maomao;
- @FieldTypeAnnotation(hobby = { "phone", "buy" }, age = 27, type = "normal")
- private String zhangwenping;
- @MethodAnnotation()
- public void method1() {
- }
- @MethodAnnotation(desc="method2")
- public void method2() {
- }
- public static void main(String[] args) {
- // 此处要用反射将字段中的注解解析出来
- Class<ReflectAnnotation> clz = ReflectAnnotation.class;
- // 判断类上是否有次注解
- boolean clzHasAnno = clz.isAnnotationPresent(FieldTypeAnnotation.class);
- if (clzHasAnno) {
- // 获取类上的注解
- FieldTypeAnnotation annotation = clz.getAnnotation(FieldTypeAnnotation.class);
- // 输出注解上的属性
- int age = annotation.age();
- String[] hobby = annotation.hobby();
- String type = annotation.type();
- System.out.println(clz.getName() + " age = " + age + ", hobby = " + Arrays.asList(hobby).toString() + " type = " + type);
- }
- // 解析字段上是否有注解
- // ps:getDeclaredFields会返回类所有声明的字段,包括private、protected、public,但是不包括父类的
- // getFields:则会返回包括父类的所有的public字段,和getMethods()一样
- Field[] fields = clz.getDeclaredFields();
- for(Field field : fields){
- boolean fieldHasAnno = field.isAnnotationPresent(FieldTypeAnnotation.class);
- if(fieldHasAnno){
- FieldTypeAnnotation fieldAnno = field.getAnnotation(FieldTypeAnnotation.class);
- //输出注解属性
- int age = fieldAnno.age();
- String[] hobby = fieldAnno.hobby();
- String type = fieldAnno.type();
- System.out.println(field.getName() + " age = " + age + ", hobby = " + Arrays.asList(hobby).toString() + " type = " + type);
- }
- }
- //解析方法上的注解
- Method[] methods = clz.getDeclaredMethods();
- for(Method method : methods){
- boolean methodHasAnno = method.isAnnotationPresent(MethodAnnotation.class);
- if(methodHasAnno){
- //得到注解
- MethodAnnotation methodAnno = method.getAnnotation(MethodAnnotation.class);
- //输出注解属性
- String desc = methodAnno.desc();
- System.out.println(method.getName() + " desc = " + desc);
- }
- }
- }
- }
4、输出
- com.uno.ray.ReflectAnnotation age = 27, hobby = [smoke] type = class
- maomao age = 27, hobby = [sleep, play] type = ignore
- zhangwenping age = 27, hobby = [phone, buy] type = normal
- method2 desc = method2
- method1 desc = method1
相关推荐
自定义注解和通过反射获取注解
简单demo,导入即可运行。
java 自定义注解验证 可自己添加所需要的注解,本案例中只写了三个自定义注解类 本案例只花了半天时间,如有不好之处请多提提意见。谢谢!
通过反射获取注解的属性值 1、获取类上注解的值 1.1 定义注解类 1.2 定义使用注解的类 1.3 测试类 1.4 测试结果 2、获取属性变量上注解的值 2.1 定义注解类 2.2 定义使用注解的类 2.3 定义测试类 2.4 测试结果 3、...
包括Java自定义注解以及包括自定义注解的应用实例。以及注解相关知识的注解
java 通过反射获取类上注解,方法上注解,注解里的值及方法参数,项目为maven项目。导入时记得选择maven项目
这个一个自定义注解实现给注解传递伪动态参数的小案例,可以在此自定义注解的基础上来记录接口的调用记录。
通过一个超市的自动售卖机的例子,详细说明了java的自定义注解的使用。
spring中自定义注解(annotation)与AOP中获取注解.通过实例演示自定义注解。
java自定义注解实践,介绍详细!值得参考
springboot工程通过自定义response注解、java反射机制、自定义java拦截器、自定义功能类实现WebMvcConfigurer接口等功能,实现自定义规范化返回数据结构。
自定义注解实现由类自定生成数据库中的表,适合各种类型的数据库,本案例主要实现的时sql server和oracle
自定义注解得使用,模拟spring通过注解方式创建bean实例!
利用java注解机制,实现自定义注解实例,例子中实现了简单的注解赋值和获取并打印值。
java 元注解+拦截器实现自定义注解 @CmwAutoWired:自定义依赖注入 注意:注入的接口和实现类需要在同一包名下,注解的是类则无限制 @FieldAnnotation:自定义属性注解 @MethodAnnotation:自定义方法注解 @...
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解
自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回...
自定义实现Autowired、Component、Configuration、SpringBootApplication注解,通过Java的反射完成。
自定义java注解开发,javabean中某方法添加该自定义注解,配置该方法相关信息指标,通过全局扫描该注解获取全部方法及相关指标,自动执行方法(本demo用于系统监控开发)