注解
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());
}
}
}

浙公网安备 33010602011771号