注释 Annotation

修饰Annotation的Annotation:
Target:用来说明该注释可以出现的位置。
@Target(value={ElementType.TYPE,ElementType.METHOD,Element.FIELD})分别表示可以出现在类上、方法上和成员变量上。其中value可以省略
Retention:用来修饰注释可以保留到什么时候。
@Retention(RetentionPolicy.RUNTIME)表示可以保留到运行时。RetentionPolicy.CLASS表示保留到字节码,RetentionPolicy.SOURCE表示保留到元代码

Annotation的定义:

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//表示可以出现在类、方法和成员变量上。
public @interface Test {
    public String value();
    public int age()default 20;
}

运用:

@Test(value = "abc",age = 20)
public class Demo02 {
}

Annotation的应用:可以通过反射来获取类上的、方法上的和成员变量变量上的Annotation对象,这些对象中就有定义Annotation时所加的属性以及运用时所赋予的值。
定义Annotation:

@Retention(RetentionPolicy.RUNTIME)//保留到运行时,否则通过反射不会的到该注释。
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface MyAnno {
    public String name();
    public int age();
}

运用Annotation:

public class test {
    @MyAnno(name = "张三",age = 20)//对Annotation中的属性进行赋值
    public void bb()
    {
        System.out.println("This is bb method");
    }
}

通过反射来获取Annotation中的信息:

public class Main {
    public static void main(String[] args)throws Exception {
        Class testclass=test.class;
        Method[] methods=testclass.getDeclaredMethods();
        for(Method method:methods)
        {
            Annotation myAnno=method.getDeclaredAnnotation(MyAnno.class);
            if(myAnno!=null)
            {
                method.invoke(testclass.newInstance(),new Object[]{});//因为不是静态方法,因此要有实例对象。
                MyAnno myAnno1=(MyAnno) myAnno;
                System.out.println(myAnno1.name());
                System.out.println(myAnno1.age());
            }
        }
    }
}

Method、Field、Class类的对象都可以调用获得Annotation对象的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值