如何利用反射操作注解
1. 根据全类名获取类加载器
Class c1 = Class.forName("com.peng.demo.Student");
2. 通过反射获得 注解
Annotation[] annotations = c1.getAnnotations();
3. 获得注解的value值
TablePeng tablePeng= (TablePeng) c1.getAnnotation(TablePeng.class);
String value = tablePeng.value();
System.out.println(value); // db_student
4. /获得指定注解的值
Field name = c1.getDeclaredField("name");
FieldPeng annotation = name.getAnnotation(FieldPeng.class);
System.out.println(annotation.columnName()); //db_name
System.out.println(annotation.type()); //varchar
System.out.println(annotation.length()); //30
5. java代码
package com.peng.demo;
import java.lang.annotation.*;
import java.lang.reflect.Field;
/**
* 利用反射操作注解
*/
public class ReflectionDemo02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
//通过全类名获取Class类加载器
Class c1 = Class.forName("com.peng.demo.Student");
//通过反射获得 注解
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation); // @com.peng.demo.TablePeng(value="db_student")
}
// 获得注解的value值
TablePeng tablePeng= (TablePeng) c1.getAnnotation(TablePeng.class);
String value = tablePeng.value();
System.out.println(value); // db_student
// 获得指定注解的值
Field name = c1.getDeclaredField("name");
FieldPeng annotation = name.getAnnotation(FieldPeng.class);
System.out.println(annotation.columnName()); //db_name
System.out.println(annotation.type()); //varchar
System.out.println(annotation.length()); //30
}
}
@TablePeng("db_student") //模拟数据库的db_student表
class Student{
@FieldPeng(columnName = "db_id",type = "int",length = 10) // 模拟数据库表的每列属性结构 columnName = "db_id",type = "int",length = 10
private int id;
@FieldPeng(columnName = "db_age",type = "int",length = 10)
private int age;
@FieldPeng(columnName = "db_name",type = "varchar",length = 30)
private String name;
public Student() {
}
public Student(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
//自定义 类的注解 (String模拟数据库表名字)
@Target(ElementType.TYPE) //元注解@Target :描述注解能够作用的位置
@Retention(RetentionPolicy.RUNTIME) //元注解@Retention(保留,保持) :描述注解被保留的阶段
@interface TablePeng{
String value();
}
//自定义 属性的注解 (属性模拟表的每列结构)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FieldPeng{
String columnName();
String type();
int length();
}