Java獲取註解的欄位屬性值
阿新 • • 發佈:2019-01-31
最近看一些ORM框架的原始碼,自己記錄一些筆記.類似於JPA,不用手寫Sql,那個實體類要要@Table和@Column註解.(基於JDK1.8).
首先自己定義一個@Column註解.
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Column { String name(); String type() default "string"; int length() default 20; }
實體類(使用了Lombok的依賴,不用在新增Set()和Get()方法,直接在類上面使用註解就可以的)
@Table(name="student") @Getter @Setter public class Student { @Id(name="sid") private int sid; @Column(name="sname") private String sname; @Column(name="sex") private String sex; @Column(name="age") private int age; @Override public String toString() { return "Student{" + "sid="+ sid + ", sname='" + sname + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; } public Student(int sid, String sname, String sex, int age){ this.sid=sid; this.sname=sname; this.sex=sex; this.age=age; } public Student(){} }
接下來就是如何如何獲取@Column註解的所有屬性值,舉個例子就是獲取@Column(name="sname")中的sname.
實現的原始碼如下:
分析一下:首先我們要注意一點的就是我們註解的屬性值是私有的例項變數,首先要設定私有變數的屬性值是可以訪問的,這裡就要使用按個setAccessible(true),預設是false.保證註解屬性值可以被訪問到.
思路分析:
1:由相應類的Class例項物件獲取所有宣告的變數(包括private).同時設定這些變數值的可訪問性.
2:獲取相應的變數上面指定型別的註解(這裡是@Column註解),同時使用一個String[]陣列來儲存的.
import com.lx.orm.annotation.Column; import com.lx.orm.entity.Student; import java.lang.reflect.Field; /** * title: com.lx.orm.util * @author: * date: * description:根據註解獲取類的指定註解的屬性值 */ public class ColumnUtil { public static void main(String[] args) { String[] str=getColumnValue(Student.class); for (int i = 1; i <str.length ; i++) { System.out.println(str[i]); } } public static String[] getColumnValue(Class classz) { Field[] fields=classz.getDeclaredFields(); Field field; String[] value=new String[fields.length]; for (int i = 0; i <fields.length ; i++) { fields[i].setAccessible(true); } for(int i = 1;i<fields.length ; i++){ try { field=classz.getDeclaredField(fields[i].getName()); Column column=field.getAnnotation(Column.class); //獲取指定型別註解 if(column!=null){ value[i]=column.name(); } } catch (NoSuchFieldException e) { e.printStackTrace(); } } return value; } }
執行結果如下:
正是自己想要的那三個基於@Column註解的屬性值.