前言
如果对注解一点都不了解,强烈推荐看一下这位博主的文章,超级易懂,GO
注解
注解(Annotation)是从JDK5.0开始引用的新技术。
作用
可以将注解理解为标签,这个标签是程序的解释,对一段代码的分类,比如@override表示这段代码是重写的,@Deprecated表示这段代码是过时的,当然标签可以自己定义,按照自己的意愿对某段代码分类,方便后续操作。注解在框架中用到的特别多。
不是程序本身,可以对程序做出解释。(这一点,跟注释没什么区别)
可以被其他程序(比如编译器)读取。
使用格式
注解以“@注解名”在代码中存在,还可以添加一些参数值,例如:@SuppressWarnings(value=“unchecked”)
// 表示重写了父类的方法
@Override
public String toString() { //如果写了注解,那么下面的方法一定是父类的方法,否则会报错
return "";
}
在哪里使用
可以附加在package,class,method,field等上面,相当与给他们额外添加了辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。
自定义注解
注解有内置注解,也可以自定义注解。
在自定义注解的时候要用元注解进行注解,所谓元注解,就是对注解进行注解的注解,元注解有下面四种:
- @Target : 能注解的范围—取值范围 ElementType = PACKAGE(包),TYPE(类等),CONSTRUCTOR(构造器),FIELD(描述域),METHOD(方法),LOCAL_VARIABLE(局部变量)
- @Retention :保留到什么时候—取值范围 SOURCE(持续到源文件),CLASS(持续到class文件),RUNTIME(持续到运行时,可以被反射机制读取)
- @Documented :
- @Inherited
自定义注解的格式如下:
@interface + 注解名
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)//元注解
public @interface MyAnnotition { //注解的格式 @interface + 注解名
String studentName() default ""; //注解的参数 注意不是方法,是变量 default表示默认值
int age() default -1;
}
使用自定义注解:
//注解括号内给参数赋值,没有默认值的必须赋值 如果只有一个参数,可以省略掉参数名和等于号
@MyAnnotition(studentName = "聪明的王二狗",age = 21)
public void test() {
}
使用反射解析注解
反射下一篇写
如果只是单单给某个方法或者类注解,那么注解是没什么用的。注解的一个特点是可以被其他程序读取(区别于注释),因此可以用于向数据库中存数据时给类做注解。
注解类的注解:
@Target(value = {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface table {
String value(); // 修饰的类跟哪个表对应
}
注解类内属性的注解:
@Target(value = ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Field {
//类每个属性对应的列名
String columnName();
String type();
int length();
}
要存进数据库里的类
@table("tb_student")
public class student {
@Field(columnName = "id",type = "int",length = 10)
private int id;
@Field(columnName = "sname",type = "varchar",length = 10)
private String name;
@Field(columnName = "age",type = "int",length = 3)
private int age;
}
用来解析类的注解的程序:
public class testAnnotation {
public static void main(String[] args) {
try {
Class clazz = Class.forName("TestAnnotation.student");
//获得类的所有注解
Annotation[] annotations = clazz.getAnnotations();
for(Annotation a : annotations) {
System.out.println(a);
}
//获得指定注解的值
table table = (TestAnnotation.table) clazz.getAnnotation(table.class);
System.out.println(table.value());
//获得属性的值
java.lang.reflect.Field field = clazz.getDeclaredField("name");
Field f = field.getAnnotation(Field.class);
System.out.println(f.columnName() + "," + f.type() + "," + f.length());
} catch (Exception e) {
e.printStackTrace();
}
}
}