1. 程式人生 > >Java獲取註解的欄位屬性值

Java獲取註解的欄位屬性值

    最近看一些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註解的屬性值.