Java@annotations 注解详解

Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。

一、Java内置基本注解

  在Java中内置几种了基本的注解,下面列出几种常用的注解:

  1@Deprecated:用该注解注释的程序元素,表明不鼓励程序员使用这样的元素,通常是它很危险或存在更好的选择。

  2@Override:表明当前的方法定义将覆盖超类中的方法。

  3@SuppressWarnings:表明关闭不当的编译器警告信息。

  4@Documented:表明某一类型的注释将通过javadoc和类似的默认工具进行文档化。

  5@Inherited:允许子类继承父类中的注解。

  6@Retention:表明需要在什么级别保存该注解信息。

  7@Target:表明该注解可以用于什么地方。

  8@Generated:该注解用于标记已生成的源代码,它可以用于区分单个文件中用户编写的代码和生成的代码。

  9@PostConstruct:该注解用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。

  10@PreDestroy:该注解作为回调通知用于各方法,以表示该实例正处于被容器移除的过程中。

  11@Resource:该注解用于标记应用程序所需要的资源。

二、自定义注解及其应用

1)、定义一个最简单的注解



public @interface MyAnnotation {



    //......



}



2)、把注解加在某个类上:



@MyAnnotation



public class AnnotationTest{



    //......



}

 

下面是自定义注解的一个例子 

复制代码
@Documented

@Target({ElementType.TYPE,ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public @interface Yts {

    public enum YtsType{util,entity,service,model};

   public YtsType classType() default YtsType.util;

}

 
复制代码

 

复制代码
1 @Documented

2 @Retention(RetentionPolicy.RUNTIME)

3 @Target(ElementType.METHOD)

4 @Inherited

5 public @interface HelloWorld {

6    public String name()default "";

7 }
复制代码

 

@Retention(RetentionPolicy.RUNTIME)

定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。

@Target({ElementType.TYPE,ElementType.METHOD})

因此这个注解可以是类注解,也可以是方法的注解

这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等

 

java的反射机制可以帮助,得到注解,代码如下:

复制代码
 1 public class ParseAnnotation {

 2 

 3      public void parseMethod(Class clazz) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException{

 4   Object obj = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{});

 5     for(Method method : clazz.getDeclaredMethods()){

 6         HelloWorld say = method.getAnnotation(HelloWorld.class);

 7         String name = "";

 8         if(say != null){

 9            name = say.name();

10            method.invoke(obj, name);

11         }

12        Yts yts = (Yts)method.getAnnotation(Yts.class);

13        if(yts != null){

14           if(YtsType.util.equals(yts.classType())){

15           System.out.println("this is a util method");

16         }else{

17             System.out.println("this is a other method");

18             }

19         }

20       }

21     }

22     @SuppressWarnings("unchecked")

23     public void parseType(Class clazz) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{

24         Yts yts = (Yts) clazz.getAnnotation(Yts.class);

25         if(yts != null){

26             if(YtsType.util.equals(yts.classType())){

27                 System.out.println("this is a util class");

28             }else{

29                 System.out.println("this is a other class");

30             }

31         }

32     }

33     

34 }
复制代码

 

前一个方法是解析得到方法注解的,后一个方法是得到类注解的

以下是测试方法类

复制代码
 1 @Yts(classType =YtsType.util)

 2 public class SayHell {

 3 

 4     @HelloWorld(name = " 小明 ")

 5     @Yts

 6     public void sayHello(String name){

 7         if(name == null || name.equals("")){

 8             System.out.println("hello world!");

 9         }else{

10             System.out.println(name + "say hello world!");

11         }

12     }

13 }
复制代码

 

复制代码
1 public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {

2         ParseAnnotation parse = new ParseAnnotation();

3         parse.parseMethod(SayHell.class);

4         parse.parseType(SayHell.class);

5     }

三、注解处理器

  如果没有用来读取注解的工具,那注解也不会比注释更有用,使用注解的过程中,很重要的一部分就是创建与使用注解处理器,而注解处理器的编写需要更加实际应用来灵活应用。

四、注意

  1、注解元素可以用的类型只有:所有基本类型(int,float,boolean)StringClassenumAnnotation、以上类型的数组。

  2、在定义元素的默认值时有限制,首先,元素不能有不确定的值,也就是说,元素必须要么具有默认值,要么在使用注解时提供元素的值;其次,对于非基本类型的元素,不能以null作为其值。

  3、注解不支持继承。

 

你可能感兴趣的:(Annotations)