Java自定义注解

旧城等待, 2022-06-10 03:53 426阅读 0赞

简介:

  1. 注解是在JDK5.0及以后版本中引入的。他可以用于创建文档,跟踪代码中的依赖性,甚至执行基本的编译时检查,而且还可以作为在spring框架中进行注解式注入Bean属性,用来减少写配置文件。注解是以@+注解名在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解,单值注解、完整注解三类。他们都不会直接影响到程序的语义,只是作为注解存在,可以通过反射机制编程实现对这些元数据的访问。

java自定义注解的更多介绍,大家可以看下面的系列文章《深入理解Java:注解(Annotation)基本概念》

注解的3中基本类型

a、标记注解 —没有变量,只有名称标示 例如:@annotation

b、单一值注解 —在标记注解的基础上提供一段数据。 例如:@annotation(“data”)

c、完整注解 —可以包括多个数据成员,每个数据成员由名称和值构成

例如:@annotation(val1=”data1”,val2=”data2”)

DEMO

自定义注解的接口声明

  1. package com.ymhj.yas.yoshinoya.aop;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. /*
  7. * 常用注解说明:
  8. * 1. RetentionPolicy(保留策略)是一个enum类型,有三个值
  9. * SOURCE -- 这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译后,Annotation的数据就会消失,并不会保留在编译好的.class文件里
  10. * CLASS -- 这个Annotation类型的信息保留在程序源码中,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟 机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS。
  11. * RUNTIME -- 在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的。
  12. *
  13. * 2.ElementType @Target中的ElementType用来指定Annotation类型可以用在哪些元素上
  14. * TYPE(类型) -- 在Class,Interface,Enum和Annotation类型上
  15. * FIELD -- 属性上
  16. * METHOD -- 方法上
  17. * PARAMETER -- 参数上
  18. * CONSTRUCTOR -- 构造函数上
  19. * LOCAL_VARIABLE -- 局部变量
  20. * ANNOTATION_TYPE -- Annotation类型上
  21. * PACKAGE -- 包上
  22. *
  23. * 3.Documented -- 让这个Annotation类型的信息能够显示在API说明文档上;没有添加的话,使用javadoc生成的API文件找不到这个类型生成的信息
  24. */
  25. @Retention(RetentionPolicy.RUNTIME)
  26. @Target({ElementType.METHOD})
  27. public @interface MyAnnotation {
  28. String descraption() default "";
  29. }

自定义注解的实现

  1. package com.ymhj.yas.yoshinoya.aop;
  2. import java.lang.annotation.Annotation;
  3. import java.lang.reflect.Method;
  4. import org.aspectj.lang.JoinPoint;
  5. import org.aspectj.lang.ProceedingJoinPoint;
  6. import org.aspectj.lang.annotation.Aspect;
  7. import org.aspectj.lang.annotation.Before;
  8. import org.aspectj.lang.annotation.Pointcut;
  9. import org.springframework.core.annotation.Order;
  10. import org.springframework.stereotype.Component;
  11. @Aspect
  12. @Component
  13. @Order(1) //Spring 4.2 利用@Order控制配置类的加载顺序
  14. public class AnnotationImplement {
  15. //切面
  16. @Pointcut("@annotation(com.ymhj.yas.yoshinoya.aop.MyAnnotation)")
  17. public void annotation(){
  18. //此处什么都不用写
  19. }
  20. //此处写具体的实现
  21. //定义通知(前置)
  22. //切面类(依然放在com.abc.advice包中)中定义了Before、Around、AfterReturning和After 4中增强处理
  23. //ProceedingJoinPoint :使用这个类取处理日志,只能处理环绕通知,该类是JoinPoint的子类:ProceedingJoinPoint is only supported for around advice
  24. @Before("annotation()")
  25. public void beforePoint(JoinPoint point){
  26. /**********************注解处理器**************/
  27. System.err.println(point.getTarget().getClass().getName());//获取目标对象对应的类名
  28. //获取实现类继承的接口名
  29. @SuppressWarnings("rawtypes")
  30. Class[] c = point.getTarget().getClass().getInterfaces();
  31. System.err.println("实现类继承的接口名:"+c[0]);
  32. //获取在这个service实现类上的annotation
  33. Annotation[] a = point.getTarget().getClass().getAnnotations();
  34. //获取这个类上的注解的个数
  35. System.out.println("应用注解类上的注解个数:"+a.length);
  36. //判断这个类上面的注释是否是AnnotationName这个自定义的注解,如果是返回这个注解,如果不是返回null
  37. if(point.getTarget().getClass().getAnnotation(MyAnnotation.class)!=null){
  38. //获取到这个类上的注解
  39. MyAnnotation anns = point.getTarget().getClass().getAnnotation(MyAnnotation.class);
  40. //输出这个类上的注解的值
  41. System.out.println("注释在实现类上的annotation:"+anns.descraption());
  42. }
  43. //判断这个接口上是否存在此注解
  44. if(c[0].getAnnotation(MyAnnotation.class)!=null){
  45. MyAnnotation an = (MyAnnotation) c[0].getAnnotation(MyAnnotation.class);
  46. System.out.println("注解对象所实现接口上的注解值:"+an.descraption());
  47. }
  48. //获取目标对象上正在执行的方法名
  49. System.err.println("目标对象上正在执行的方法名:"+point.getSignature().getName());//方法名
  50. //获取到这个类上面的所有方法全名
  51. Method meths[] = point.getSignature().getDeclaringType().getMethods();
  52. System.out.println("方法上面的全名:"+meths[0]);
  53. //获取到这个类上面的方法上面的注解
  54. Annotation[] anns = meths[1].getDeclaredAnnotations();
  55. System.out.println("正在执行方法上面的注解:"+((MyAnnotation)anns[2]).descraption());
  56. //让你注释的那个方法执行
  57. //point.proceed();
  58. /**********************注解处理器**************/
  59. Object[] objects=point.getArgs();//参数名
  60. for (int i = 0; i < objects.length; i++) {
  61. System.err.println(objects.toString());
  62. }
  63. }
  64. }
  65. 上面的demo中,声明的是一个运行时方法注解,所以在使用的时候,可以将@MyAnnotation注解放到某个方法上。

发表评论

表情:
评论列表 (有 0 条评论,426人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java定义注解

    简介:     注解是在JDK5.0及以后版本中引入的。他可以用于创建文档,跟踪代码中的依赖性,甚至执行基本的编译时检查,而且还可以作为在spring框架中进行注解式注入Be

    相关 Java定义注解

    说到注解,也是面试中的重点高频知识点,因为利用注解加上反射可以做很多事情,通过注解对一些类或方法进行标示(override),通过注解、反射和AOP切面来做缓存,通过注解在类文