一 注解的概念
- JDK1.5之后的新特性
- 说明程序的
- 使用注解:@注解名称
二 注解的作用
- 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
假设,我们需要在targetdocdir放置我们生成的文档,需要对c:jproject里的cn.com.linuxaid包内的源文件建立程序文档。那么我们需要进入c:jprojectcncom(也就是包含了overview.html的目录——假如你提供了它的话)。然后运行 javadoc -d targetdocdir cn.com.linuxaid - 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
- 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
三 注解的分类
1 Jdk内置注解
@Override:检测被标注的方法是否是继承自父类(接口)的。
@Deprecated:该注解标注的内容,表示已经过时。
@SuppressWarnings(“all”):抑制警告。
2 自定义注解
- 格式
public@interface MyAnno(){
属性列表;
} - 本质:就是一个接口。
- 注解接口中的属性
a. 返回值类型有以下取值
基本数据类型
String
枚举
注解
以上类型的数组
a. 定义了属性,在使用时给属性赋值。
如果使用default给了默认初始化值,使用时可以不赋值。
如果只有一个属性需要赋值,并且名称是value,可直接写值。
数组赋值使用{}
3 元注解
- 元注解:注解的注解。
- 分类
@Target:描述注解能作用的位置。
@Retention:描述注解被保留的阶段。
@Documented:描述注解是否能被抽取到Api文档中。
@Inherited:描述注解是否被子类继承。
3 注解的解析
- 获取注解定义的位置的对象 (Class,Method,Field)
- 获取指定的注解
- 调用注解中的抽象方法获取配置的属性值
/**
* 示例对象
*/
public class Person {
private String name;
private int age;
//构造...
//getter and setter
public void eat(){
System.out.println("人吃饭");
}
}
/**
* 自定义注解
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
String className() default "";
String methodName() default "";
}
/**
* 测试类
*/
@MyAnno(className = "cn.itcast.demo01.Person",methodName = "eat")
public class AnnoTest {
public static void main(String[] args) throws Exception{
Class<AnnoTest> annoTestClass = AnnoTest.class;
/**
* 下面的代码相当于:创建了一个实现类
* public class MyAnnoImpl implements MyAnno{
* public String className(){
* return "cn.itcast.annotation.Demo1";
* }
* public String methodName(){
* return "show";
* }
* }
*/
MyAnno annotation = annoTestClass.getAnnotation(MyAnno.class);
//获取方法产生的值
String className = annotation.className();
String methodName = annotation.methodName();
//反射创建对象
Class<?> clazz = Class.forName(className);
Object o = clazz.newInstance();
//执行方法
Method method = clazz.getMethod(methodName);
method.invoke(o);
}
}