Java自定义注解

自定义注解类编写的一些规则:

1. Annotation型定义为@interface, 所有的Annotation会自动继承Java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.

2. 参数成员只能用public或默认(default)这两个访问权修饰

3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.

4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法

5. 注解也可以没有定义成员, 不过这样注解就没啥用了

自定义注解类时, 可以指定目标 (类、方法、字段, 构造函数等) , 注解的生命周期(运行时,class文件或者源码中有效), 是否将注解包含在javadoc中及是否允许子类继承父类中的注解, 具体如下:

[email protected] 表示该注解目标,可能的 ElemenetType 参数包括:

ElemenetType.CONSTRUCTOR构造器声明

ElemenetType.FIELD 域声明(包括 enum 实例)

ElemenetType.LOCAL_VARIABLE 局部变量声明

ElemenetType.METHOD 方法声明

ElemenetType.PACKAGE 包声明

ElemenetType.PARAMETER 参数声明

ElemenetType.TYPE 类,接口(包括注解类型)或enum声明

[email protected] 表示该注解的生命周期,可选的 RetentionPolicy 参数包括

RetentionPolicy.SOURCE注解将被编译器丢弃

RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃

RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息

[email protected] 指示将此注解包含在javadoc 中

4. @Inherited指示允许子类继承父类中的注解

源代码

1 MyAnnotationClass.java

[java] view plain copy

  1. package com.java.annotation;
  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. * */
  9. @Retention(RetentionPolicy.RUNTIME)
  10. @Target(ElementType.TYPE)
  11. public @interface MyAnnotationClass {
  12. public String msg();
  13. }

2 MyAnnotationMethod.java

[java] view plain copy

  1. package com.java.annotation;
  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. **/
  9. @Retention(RetentionPolicy.RUNTIME)
  10. @Target(ElementType.METHOD)
  11. public @interface MyAnnotationMethod {
  12. public String common();
  13. }

3 MyAnnotationField.java

[java] view plain copy

  1. package com.java.annotation;
  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. @Retention(RetentionPolicy.RUNTIME)
  7. @Target(ElementType.FIELD)
  8. public @interface MyAnnotationField {
  9. boolean request();
  10. }

4 MyAnnotationDemo.java

[java] view plain copy

  1. package com.java.annotation;
  2. @MyAnnotationClass(msg = "这是一个类注解")
  3. public class MyAnnotationDemo {
  4. public MyAnnotationDemo() {
  5. }
  6. public MyAnnotationDemo(String text) {
  7. this.text = text;
  8. }
  9. @MyAnnotationMethod(common = "这是一个方法注解")
  10. public void method() {
  11. }
  12. @MyAnnotationField(request = true)
  13. private String text;
  14. }

5 MyAnnotationTest.java

[java] view plain copy

  1. package com.java.annotation;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. public class MyAnnotationTest {
  5. public static void main(String[] args) {
  6. MyAnnotationDemo demo = new MyAnnotationDemo("hello rollen");
  7. MyAnnotationClass annotationClass = demo.getClass().getAnnotation(MyAnnotationClass.class);
  8. System.out.println(annotationClass.msg());
  9. Method method = null;
  10. try {
  11. method = demo.getClass().getMethod("method",new Class[0]);
  12. } catch (SecurityException e) {
  13. e.printStackTrace();
  14. } catch (NoSuchMethodException e) {
  15. e.printStackTrace();
  16. }
  17. MyAnnotationMethod annotationMethod = method.getAnnotation(MyAnnotationMethod.class);
  18. System.out.println(annotationMethod.common());
  19. Field field = null;
  20. try {
  21. field = demo.getClass().getDeclaredField("text");
  22. } catch (SecurityException e) {
  23. e.printStackTrace();
  24. } catch (NoSuchFieldException e) {
  25. e.printStackTrace();
  26. }
  27. MyAnnotationField annotationField = field.getAnnotation(MyAnnotationField.class);
  28. System.out.println(annotationField.request());
  29. }
  30. }

运行结果

下载地址:

CSDN:http://download.csdn.net/detail/haishu_zheng/9569169

Github:https://github.com/zhenghaishu/AnnotationDemo

时间: 2024-12-22 06:21:14

Java自定义注解的相关文章

java自定义注解类

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

深入 Java自定义注解

我们在使用Spring框架的时候,会经常使用类似:@Autowired 这样的注解.我们也可以自己定义一些注解.Java的注解主要在包:java.lang.annotation中实现. 1. 元注解 什么是元注解?你可以这样理解,元注解是自定义注解的注解.元注解主要包含4个.他们主要在java.lang.annotation中可以找到.我们自己要创建注解的时候必须要用到这些元注解.所以必须彻底理解这四个元注解的含义. 1. @Documented 2. @Inherited 3. @Retent

Java自定义注解反射校验数据

package com.annotations.ecargo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUN

转!java自定义注解

转自:http://blog.csdn.net/yixiaogang109/article/details/7328466  Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention

Java自定义注解的使用

最近学习了一下Java的自定义注解,终于知道了框架那些注解是咋个写出来的了,以后我也可以自己写框架,自己定义注解,听着是不是很牛的样子?不要心动,赶快行动,代码很简单,一起来学习一下吧! 这个例子是模仿框架的一个对sql拼装的例子,用注解实现对model也就是实体类的注释,就可以写出查询该字段的sql.好了,废话少说,一看代码便知.大家可以根据自己的需求修改. package com.annotation.demo; import java.lang.annotation.Documented;

java 自定义注解以及获得注解的值

1.自定义注解 import java.lang.annotation.*; @Documented @Target(ElementType.FIELD) @Inherited @Retention(RetentionPolicy.RUNTIME ) public @interface MyAnno { /** * 是否能为null * @return */ boolean isCanNull() default true; /** * 是否能为空字符串 * @return */ boolean

Java 自定义注解及利用反射读取注解

一.自定义注解 元注解: @interface注解: 定义注解接口 @Target注解: 用于约束被描述的注解的使用范围,当被描述的注解超出使用范围则编译失败.如:ElementType.METHOD,ElementType.TYPE: @Retention 注解:用于约束被定义注解的作用范围,作用范围有三个: 1,.RetentionPolicy.SOURCE:作用范围是源码,作用于Java文件中,当执行javac时去除该注解. 2.RetentionPolicy.CLASS:作用范围是二进制

【面试加分项】java自定义注解之申明注解

之前的博客http://blog.csdn.net/u010590685/article/details/47029447介绍了java的注解的基本知识今天我们学习如何使用自定义注解. 首先我们要声明一个注解,声明代码如下: import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.

如何使用java自定义注解?demo

1.Description.java package kzfy.bk.com; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(E