Java知识点总结(注解-解析注解)
@(Java知识点总结)[Java, 注解]
通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。
使用注解步骤:
定义注解
类中使用注解
解析注解
示例:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value={ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAnnotation {
String value();
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value={ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldAnnotation {
String columnName();
String type();
int length();
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value={ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TableAnnotation {
String value();
}
@TableAnnotation("tb_student")
public class Student {
@FieldAnnotation(columnName="id",type="int",length=10)
private int id;
@FieldAnnotation(columnName="sname",type="varchar",length=10)
private String name;
@FieldAnnotation(columnName="age",type="int",length=3)
private int age;
@MethodAnnotation("get方法上的注解")
public int getId() {
return id;
}
@MethodAnnotation("set方法上的注解")
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;
}
}
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Demo3 {
// 使用反射获取注解,生成类对应的数据库表
private static void test1(Class clazz) {
// 获得类所有的注解
Annotation[] annotations = clazz.getAnnotations();
for (Annotation a : annotations) {
System.out.println(a);
}
// 通过注解的名字获取注解
TableAnnotation t = (TableAnnotation) clazz.getAnnotation(TableAnnotation.class);
System.out.println(t.value());
// 获得属性上的注解
try {
Field f = clazz.getDeclaredField("age");
FieldAnnotation fa = f.getAnnotation(FieldAnnotation.class);
System.out.println("字段名称:" + fa.columnName() + ",字段类型:" + fa.type() + ",字段长度:" + fa.length());
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
// 根据获得的表名、字段信息,拼出DDL语句,然后使用JDBC执行这个SQL语句,在数据库中生成相关的表
}
//获取方法上的注解
private static void test2(Class clazz) {
// 获取所有方法上的注解
Method[] ms = clazz.getMethods();
for (Method m : ms) {
boolean isExist = m.isAnnotationPresent(MethodAnnotation.class);
if (isExist) {
MethodAnnotation ma = m.getAnnotation(MethodAnnotation.class);
System.out.println(ma);
}
}
// 获取指定方法上的注解
try {
Method method = clazz.getMethod("getId", null);
Annotation[] as = method.getAnnotations();
for (Annotation a : as) {
if (a instanceof MethodAnnotation) {
MethodAnnotation ma = (MethodAnnotation) a;
System.out.println(ma);
}
}
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Class clazz = null;
try {
clazz = Class.forName("com.gs.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
test1(clazz);
test2(clazz);
}
}