注解定义:使用@interface,定义的参数需要加圆括号,如 name(),可设默认值;
注解读取:通过反射获取注解的值,在获取参数值之前建议使用isAnnotationPresent()判断注解是否存在,避免出现空指针异常。
package main.java.per.learning.annotation;
import java.lang.annotation.Annotation;
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;
public class AnnotationDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class c1 = Class.forName("main.java.per.learning.annotation.Student");
// 通过反射获取注解(类注解)
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println("annotations:" + annotation);
}
// Annotation[] declaredAnnotations = c1.getDeclaredAnnotations();
// for (Annotation annotation : declaredAnnotations) {
// System.out.println("declaredAnnotations:" + annotation);
// }
// 获取注解的值
if (c1.isAnnotationPresent(ClassMing.class)){
ClassMing classMing = (ClassMing) c1.getAnnotation(ClassMing.class);
String tableName = classMing.tableName();
System.out.println(tableName);
}
// 获取类指定注解的值
Field name = c1.getDeclaredField("name");
// 判断该属性上是否存在某类型注解,避免空指针异常
if(name.isAnnotationPresent(FieldMing.class)) {
System.out.println("name上有@FieldMing注解...");
FieldMing fieldMing = name.getAnnotation(FieldMing.class);
String columnName = fieldMing.columnName();
String type = fieldMing.type();
int length = fieldMing.length();
System.out.println("columnName = " + columnName);
System.out.println("type = " + type);
System.out.println("length = " + length);
}
}
}
@ClassMing(tableName = "db_student")
class Student{
@FieldMing(columnName = "name", type = "varchar", length = 66)
private String name;
@FieldMing(columnName = "address", type = "varchar", length = 50)
private String address;
@FieldMing(columnName = "age", type = "int", length = 2)
private int age;
}
/**
* 定义一个类注解
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface ClassMing{
String tableName() default "";
}
/**
* 定义一个属性注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FieldMing{
String columnName() default "";
String type() default "";
int length() default -1;
}