注解

1、常见注解

JDK自带注解

@Override:重写

@Deprecated:过时的方法

@SuppressWarnings(“”):忽略警告

2、注解的分类

2.1 按照运行机制分

源码注解:注解只在源码中存在,编译成.class文件就不存在了;

编译时注解:注解在源码和.class文件中都存在;

运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解;

2.2 按照来源分

JDK注解

第三方注解

自定义注解

元注解:给注解进行注解的注解

3、自定义注解

3.1 自定义注解语法

/**

 * 元注解

 */

//注解的作用域

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

//注解的生命周期

@Retention(RetentionPolicy.RUNTIME)

//允许子类继承,只有用在类上时才会生效,对接口无效

@Inherited

//生成javadoc时会包含注解

@Documented

public @interface Test {

 

/**

 * 1.成员类型是受限制的,合法的类型包括:

 * 原始类型及String,Class,Annotation,Enumeration;

 * 2.如果注解只有一个成员,则成员名必须取名为value(),在使用

 * 时可以省略成员名和赋值的“=”号;

 * 3.注解类可以没有成员,没有成员的注解称为标识注解;

 */

//value();

//成员以无参无异常的方式声明

String desc();

String author();

//可以用default为成员指定一个默认值

int age() default 18;

}

 


使用注解的语法:3.2 使用自定义注解

@<注解名>(成员=值,成员=值,……)

实例:

@Test(desc="",author="",age=18)

public void demo(){

}
//获得对象类类型

Class c = Demo.class;

//获得类上面的注解

boolean b = c.isAnnotationPresent(Test.class);

if(b){

//获得注解对象

Test t = (Test) c.getAnnotation(Test.class);

//打印注解成员的值

System.out.println(t.desc());

System.out.println(t.author());

System.out.println(t.age());

}

4、解析注解

4.1 获得类上的注解

 

//获得类中的所有方法对象

Method[] ms = c.getMethods();

for (Method m : ms) {

boolean is = m.isAnnotationPresent(Test.class);

if(is){

//获得方法上的注解

Test mt = m.getAnnotation(Test.class);

System.out.println(mt.desc());

System.out.println(mt.author());

System.out.println(mt.age());

}

}

 

 

 

4.2 获得方法上的注解

方法二

//方法二

for (Method m : ms) {

Annotation[] as = m.getAnnotations();

for (Annotation a : as) {

if(a instanceof Test){

Test t = (Test) a;

System.out.println(t.desc());

System.out.println(t.author());

System.out.println(t.age());

}

}

}

 

posted @ 2019-05-17 21:55  雨如烟  阅读(211)  评论(0)    收藏  举报