1.定义
注解(Annotation),或者叫做注释类型。
注解Annotation是一种引用数据类型,编译生成xxx.class文件
2.如何自定义注解?
语法格式:
[修饰符列表] @interface 注解类型名{ }
3.注解如何使用?用在什么地方?
(1)注解使用时的语法格式:
@注解类型名
(2)注解可以出现在类上、属性上、方法上、变量上等…
注解还可以出现在注解类型上
4.JDK的内置注解
(1)@Override
该注解只能注解方法,这个注解是个编译器参考的,和运行阶段没有关系。凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器会报错。
(2)@Deprecated
用于表示所修饰的元素(类, 方法,构造器等等)已过时。通常是因为所修饰的结构危险或存在更好的选择,过时是可以用的,意义只是作为一种提示,因为原来的项目中用的老的代码必须要能用,过时是给我们后面做开发的提示
(3)@SuppressWarnings
抑制编译器警告,警告信息在eclipse中更明显一些
5.元注解
(1)元注解是用来标注“注解类型”的“注解”,成为元注解
(2)常见的元注解:Target、Retention
①Target(ElementType.METHOD):表示“被标注的注解”只能出现在方法上
②Retention注解:这个注解用来标注“被标注的注解”最终保存在哪里
6.如果一个注解当中有属性,那么必须给属性赋值,如果一个注解的名字是value的话,在使用时该属性名可以省略,如果是两个就不能省略了。
7.注解当中的属性可以是哪种类型?
byte、short、long、int、float、double、boolean、char、String、Class、枚举类型;
属性的类型可以是以上每一种类型以及它们的数组形式
8.如果数组中只有一个元素,大括号可以省略
9.通过反射机制获取注解中的value
利用反射获取注解内容步骤:
1.先利用反射获取Class对象
2.使用Class.getAnnotations()获取类上的所有注解内容(如果只想获取注解的值,可以使用Class.getAnnotation(XXX.class)获取特定的注解,然后在获取的注解内容使用.value()即可以获取注解的value值)
3.使用Class.getDeclaredField(“XX”)获取Class对象的特定内容的field对象,然后使用field.getAnnotation(XXX.class),获取到注解的内容
代码示例:
@Tablemi("mi")
class Student2 {
@Fieldmi(name = "id", type = "int", length = 10)
private int id;
@Fieldmi(name = "age", type = "int", length = 3)
private int age;
@Fieldmi(name = "name", type = "varchar", length = 5)
private String name;
public Student2() {
}
public Student2(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
}//并提供get和set方法
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tablemi{
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldmi{
String name();
String type();
int length();
}
测试代码:
Class c1 = Class.forName("com.mi.demo01.Student2");
//通过反射获取注解
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
//获的注解的value值
Tablemi tablemi = (Tablemi)c1.getAnnotation(Tablemi.class);
String value = tablemi.value();
System.out.println(value);
//获得类指定的注解
Field field = c1.getDeclaredField("id");
Fieldmi fieldmi = field.getAnnotation(Fieldmi.class);
System.out.println(fieldmi.name());
System.out.println(fieldmi.type());
System.out.println(fieldmi.length());
//获得类指定的注解
Field field1 = c1.getDeclaredField("name");
Fieldmi fieldmi1 = field1.getAnnotation(Fieldmi.class);
System.out.println(fieldmi1.name());
System.out.println(fieldmi1.type());
System.out.println(fieldmi1.length());
//获得类指定的注解
Field field2 = c1.getDeclaredField("age");
Fieldmi fieldmi2 = field2.getAnnotation(Fieldmi.class);
System.out.println(fieldmi2.name());
System.out.println(fieldmi2.type());
System.out.println(fieldmi2.length());
注解在开发中的作用
注解在程序中等同于一种标记



