java自定义注解

Java 注解

  Annotation(注解) 是 JDK5.0 及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在 class 文件中出现。

在写代码过程常遇到的注解有 @Override、@SuppressWarnings,@Override 注解表示重写父类方法,、@SuppressWarnings 注解表示忽略警告信息

关于四个作用相同注解
     @Component("info")   不分层
     @Repository("info")  dao
     @Service("info")     biz
     @Controller("info")  action

     @Value()    在一个类中注入普通属性值

     @Resource   在一个类中注入域属性

     @Autowired  在一个类中注入域属性

注解(Annotation)自定义注解入门

元注解的作用就是负责注解其他注解。Java5.0 定义了 4 个标准的 meta-annotation 类型,它们被用来提供对其它 annotation 类型作说明。Java5.0 定义的元注解:
    1.@Target,
    2.@Retention,
    3.@Documented,
    4.@Inherited

  这些类型和它们所支持的类在 java.lang.annotation 包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。

@Target:

   @Target 说明了 Annotation 所修饰的对象范围:Annotation 可被用于 packages、types(类、接口、枚举、Annotation 类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch 参数)。在 Annotation 类型的声明中使用了 target 可更加明晰其修饰的目标。

作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

  取值 (ElementType) 有:

    1.CONSTRUCTOR: 用于描述构造器
    2.FIELD: 用于描述域
    3.LOCAL_VARIABLE: 用于描述局部变量
    4.METHOD: 用于描述方法
    5.PACKAGE: 用于描述包
    6.PARAMETER: 用于描述参数
    7.TYPE: 用于描述类、接口 (包括注解类型) 或 enum 声明

使用 @interface 自定义注解时,自动继承了 java.lang.annotation.Annotation 接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface 用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过 default 来声明参数的默认值。

  定义注解格式:
  public @interface 注解名 {定义体}

  注解参数的可支持数据类型:

    1. 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
    2.String 类型
    3.Class 类型
    4.enum 类型
    5.Annotation 类型
    6. 以上所有类型的数组

自定义注解案例:

1. 自定义注解

复制代码
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 public @interface Apple {5     String name();
6     String sex() default "男";
7     String phone() default "15931787945";
8     int age() default 2;
9 }
复制代码

2. 使用注解的类:

1 public class AppleTest {2     @Apple(name="张朵朵")
3   public void show(){
4 
5     }
6 }

3. 提取注解参数:

复制代码
 1 public class Test20171010{
 2    @Test
 3     public void test01(){
 4         Class<AppleTest> appleTestClass = AppleTest.class;
 5         try {6             Apple show = appleTestClass.getMethod("show").getAnnotation(Apple.class);
 7             System.out.println(show.name());
 8             System.out.println(show.sex());
 9             System.out.println(show.phone());
10             System.out.println(show.age());
11         } catch (NoSuchMethodException e) {12             e.printStackTrace();
13         }
14     }
15 }
复制代码

执行结果: