1 注解简介:
a) 存在意义: 定义后用于被编译器读取,并服务于使用注解的类上
b) 定义和使用步骤:
b.1) 定义注解
b.2) 在目标类中声明引用注解
b.3) 定义解释类解释注解和处理注解
2 注解详细概念看下图:
3 注解简单定义和使用:
1 定义注解
@Target(value={ElementType.METHOD,ElementType.TYPE}) // 指定作用范围为 方法和类上
@Retention(RetentionPolicy.RUNTIME)// 指定有效范围(soruce + class 级别都有效并支持反射)
public @interface SxtAnnotation01 {
// 定义属性时,基本需要有默认值,否则使用注解时候会报错 提示让有初始值 初始值一般为空串或者0 如果是-1则表示不存在
String studentName() default "";
int age() default 0;
int id() default -1; //String indexOf("abc") -1
String[] schools() default {"清华大学","北京上学堂"};
}
2 使用注解
@SxtAnnotation01 // 在类上使用注解
public class Demo02 {
@SxtAnnotation01(age=19,studentName="老高",id=1001,
schools={"北京大学","北京航空航天大学"})
public void test(){ // 在方法上使用注解 并赋值
}
}
4 注解在 orm上使用简单写法:
1 定义表注解
@Target(value={ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TableAnno {
String value();
}
2 定义属性注解
@Target(value={ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldAnno {
String columnname();
String type();
int length();
}
3 实体bean上引用注解
@TableAnno(value = "student_table")
public class Student {
@FieldAnno(columnname = "id", length = 10, type = "int")
private int id;
@FieldAnno(columnname = "name", length = 10, type = "varchar")
private String name;
@FieldAnno(columnname = "age", length = 3, type = "int")
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4 定义解析处理注解类
public class AnalyticalAnnocation {
/**
* 解析自定义注解
*/
public static void main(String[] args) {
try {
Class<Student> clazz = (Class<Student>) Class.forName("zm.annocation.Student");
// 得到类注解TableAnno的属性值
TableAnno tableAnno = clazz.getAnnotation(TableAnno.class);
System.out.println(tableAnno.value()); // student_table
// 得到属性注解
Field field = clazz.getDeclaredField("id");
FieldAnno fieldAnno = field.getAnnotation(FieldAnno.class);
int idLen = fieldAnno.length();
String idType = fieldAnno.type();
String idName = fieldAnno.columnname();
System.out.println(idName + "--" + idType + "--" + idLen );//id--int--10
Field field1 = clazz.getDeclaredField("name");
FieldAnno fieldAnno1 = field1.getAnnotation(FieldAnno.class);
int nameLen = fieldAnno1.length();
String nameType = fieldAnno1.type();
String nameName = fieldAnno1.columnname();
System.out.println(nameName + "--" + nameType + "--" + nameLen );//name--varchar--10
Field field2 = clazz.getDeclaredField("age");
FieldAnno fieldAnno2 = field2.getAnnotation(FieldAnno.class);
int ageLen = fieldAnno2.length();
String ageType = fieldAnno2.type();
String ageName = fieldAnno2.columnname();
System.out.println(ageName + "--" + ageType + "--" + ageLen );//age--int--3
// 如上操作得到实体Student对应表明,表字段名称,类型,长度,下面就可以通过拼接来实现创建.查询,等SQL操作
// ........ 略
} catch (Exception e) {
e.printStackTrace();
}
}
}