侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

注解

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 96 阅读 / 2,948 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
定义
@inteface 名(){
	String 参数()
}
在定义里不写处理,处理写在别的地方用反射获取注解和参数然后再执行相应动作。

元注解

1.
@Target,
1.
type 类、接口(包括注释类型)或枚举声明 
2.
field 字段声明(包括枚举常量) 
3.
method 方法声明 
4.
parameter 参数声明 
5.
constructor 构造方法声明 
6.
local_variable 局部变量声明 
7.
annotation_type 注释类型声明 
8.
package 包声明 
@Target(ElementType.TYPE)
public @interface Table {
    public String tableName() default "className";
}

@Target({ElementType.TYPE, ElementType.FIELD})
public @interface test {
public String tableName() default "className";
}

2.
@Retention,
SOURCE —— /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */
CLASS —— /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */
RUNTIME —— /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
3.
@Documented,
1.
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
4.
@Inherited
1.
@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类型被发现,或者到达类继承结构的顶层。

注解参数设置

定义注解格式:  public @interface 注解名 {定义体}
注解参数的可支持数据类型:
1.
所有基本数据类型(int,float,boolean,byte,double,char,long,short)    
2.
String类型    
3.
Class类型   
4.
enum类型    
5.
Annotation类型    
6.
以上所有类型的数组

如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。



获取注解属性
如果获取注解属性,当然是反射啦,主要有三个基本的方法
/**是否存在对应 Annotation 对象*/
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
    return GenericDeclaration.super.isAnnotationPresent(annotationClass);
}

/*获取 Annotation 对象/
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
Objects.requireNonNull(annotationClass);

return (A) annotationData().annotations.get(annotationClass);

}
/*获取所有 Annotation 对象数组/
public Annotation[] getAnnotations() {
return AnnotationParser.toArray(annotationData().annotations);
}



下面结合前面的例子,我们来获取一下注解属性,在获取之前我们自定义的注解必须使用元注解@Retention(RetentionPolicy.RUNTIME)
public class test {
   public static void main(String[] args) throws NoSuchMethodException {
    /**
     * 获取类注解属性
     */
    Class&lt;Father&gt; fatherClass = Father.class;
    boolean annotationPresent = fatherClass.isAnnotationPresent(MyTestAnnotation.class);
    if(annotationPresent){
        MyTestAnnotation annotation = fatherClass.getAnnotation(MyTestAnnotation.class);
        System.out.println(annotation.name());
        System.out.println(annotation.age());
    }

    /**
     * 获取方法注解属性
     */
    try {
        Field age = fatherClass.getDeclaredField(&quot;age&quot;);
        boolean annotationPresent1 = age.isAnnotationPresent(Age.class);
        if(annotationPresent1){
            Age annotation = age.getAnnotation(Age.class);
            System.out.println(annotation.value());
        }

        Method play = PlayGame.class.getDeclaredMethod(&quot;play&quot;);
        if (play!=null){
            People annotation2 = play.getAnnotation(People.class);
            Game[] value = annotation2.value();
            for (Game game : value) {
                System.out.println(game.value());
            }
        }
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
}

}





0

评论区