Java注解(Annotation)详解(3)

SOURCE:在源文件中有效(即源文件保留)
CLASS:在class文件中有效(即class保留)
RUNTIME:咋运行时有效(即运行时保留)
@Documented
  @Documented用于描述其他类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

@Inherited
  @Inherited元注解是一个标记注解,它表示了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
  注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
  当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则发射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

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

public @interface 注解名 {定义体}

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

所有基本数据类型(int,float,boolean,byte,double,char,long,short)
String类型
Class类型
enum类型
Annotation类型
以上所有类型的数组
自定义注解(Annotation)示例
package org.grape.annotation;

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;

/*
 * 作者信息注解
 * @author grape
 */

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Author {
    String name() default "";
    String group() default "";
}1
package org.grape.annotation;

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;

/*
 * 类描述注解
 * @author grape
 */

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Description {
    String value() default "";
}1
package org.grape.annotation;

@Description(value="这是一个有用的工具类")
public class Utility {
    @Author(name="jlq",group="grape")
    public String work(){
        return "work over!";
    }
}

提取注解
package org.grape.annotation;

import java.lang.reflect.Method;

public class AnalysisAnnotation {
    public static void main(String[] args) {
        try {
            Class rt_class = Class.forName("org.grape.annotation.Utility");
            Method[] methods = rt_class.getMethods();

boolean flag = rt_class.isAnnotationPresent(Description.class);
            if (flag) {
                Description description = (Description) rt_class
                        .getAnnotation(Description.class);
                System.out.println("Utility's Description---->"
                        + description.value());
                for (Method method : methods) {
                    if(method.isAnnotationPresent(Author.class)){
                        Author author = (Author)method.getAnnotation(Author.class);
                        System.out.println("Utility's Author---->" + author.name() + " from " + author.group());
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6e024012e9174d04d81325dbc2fdedc8.html