一:注解的基本概念
Java 注解就像修饰符一样,可以用于从java代码中抽取文档、跟踪代码中的依赖性或者在编译时做检查。注解可以被应用在包、类、方法、成员变量、参数和本地变量的声明中。
注解的工作原理就是,先使用注解修饰java代码,然后另一块叫做注解处理器 的代码会解析这段注解和被修饰的代码并做相应的处理。
二、JDK内置的标准注解
Java SE中内置了三个标准注解,在java.lang中,他们是:
1 、 @Override:用于修饰子类的方法覆盖了父类中的方法;
2 、@Deprecated:用于修饰已经过时了的方法,不推荐使用的方法;
3 、@SuppressWarnnings:告诉java编译器禁止编译警告。
@SuppressWarnings有一些参数用于表示特定的警告:
1. deprecation:不要给出“不赞成使用的类或方法的警告”;
2. unchecked:不要给出“类型转换时警告”;
3. fallthrough:不要给出”switch语句块没有break的警告”;
4. path:不要给出“不存在的路径”的警告;
5. serial:不要给出“可序列化类缺少serialVersionUID”的警告;
6. finally:不要给出“finally语句块不能正常完成”的警告;
7. all:不要给出以上所有情况的警告。
三、自定义注解
java提供了元注解用于自定义注解,进行自定义注解
说明:元注解---描述注解的注解
jdk5.0定义了四个元注解:
1.@Target
2.@Retention
3.@Documented
4.Inherited
@Target用来描述,自定义注解的使用范围
语法格式:@Target(ElementType.值)
ElementType取值有:
1. CONSTRUCTOR---构造器
2. FIELD---域 (domain),通常理解的属性
3. LOCAL_VARIABLE---局部变量
4. METHOD---方法
5. PACKAGE: ---包
6. PARAMETER---参数
7. TYPE---类、接口(包括注解类型) 或enum枚举的声明
@Retention用来描述自定义注解的生命周期
语法格式:@Retention(RetentionPolicy.RUNTIME)
RetentionPoicy取值有:
1. SOURCE:在源文件中有效
2. CLASS:在class文件中有效
3. RUNTIME:在运行时有效
@Documented用于表示自定义注解可以被javadoc之类的工具文档化。
@Inherited
@Inherited元注解是一个标记注解,它阐述了某个被标注的类型是被继承的。
例子:
先自定义一个注解
import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.CLASS; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Field; import javax.lang.model.element.Element; @Retention(RetentionPolicy.RUNTIME)//作用范围:运行时 @Target(ElementType.FIELD)//作用与属性 @Documented//可生产文档 public @interface Persion { String name() default "张三";//相当于注解的一个属性,并给默认值“张三” }
在一个类中使用该注解
import java.util.Date; public class Annotation { @Persion//使用自定义注解 private String name; public String getName() { return name; } }
设置测试类,通过反射机制实现使用注解为属性赋值
public class Test {
public static void main(String[] args) throws Exception {
Class a=Annotation.class;//获得反射
Object obj = a.newInstance();//进行实例化
Field field = a.getDeclaredField("name");//获得name属性
if(field.isAnnotationPresent( Persion.class)) {
Persion anno = field.getDeclaredAnnotation(Persion.class);//获得该属性的注解
field.setAccessible(true);//设置改属性可操作
field.set(obj,anno.name());//该注解的默认值赋值给该属性
}
Annotation aobj = (Annotation)obj;
System.out.println(aobj.getName());
}
}