Fork me on GitHub

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 }

执行结果:

 

posted @ 2017-10-10 17:29  L波涛  阅读(273)  评论(0编辑  收藏  举报