全部代碼如下,問題在第一個代碼片中
package ref;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import ref.annotation.ExcelField;
import ref.model.Emp;
//測試類
public class Test {
public static void main(String[] args) throws Exception {
outExcel(initData());
}
//利用反射輸出數據
public static <T> void outExcel(List<T> list) throws Exception{
Field[] declaredFields = list.get(0).getClass().getDeclaredFields();
for (Field field : declaredFields) {
ExcelField annotation = field.getAnnotation(ExcelField.class);
System.out.println(annotation.key());
}
/*
* =======================================
* ================問題如下===============
* =======================================
*/
/*
* 這裡有幾個地方,我沒看懂
* 1、<T>這是個泛型,泛型一般不都是定義在類後面嗎?泛型定義在方法上會不會不好?
* 2、下面的沒看懂代碼片中
*/
for(int i=0;i<list.size();i++){
/*------------沒看懂代碼片-開始--------------*/
//這個獲取的是Emp類型
T t = list.get(i);
//這個是Emp的屬性數組
Field[] fields = t.getClass().getFields();
for (Field field : fields) {
//field這是屬性
//field.get(t) 這句話我就不理解了
//為什麼屬性獲取Emp類,可以獲取到屬性的值
Object object = field.get(t);
/*------------沒看懂代碼片-結束--------------*/
if(object instanceof Integer) System.out.println((Integer)object);
if(object instanceof String) System.out.println((String)object);
if(object instanceof Timestamp) System.out.println((Timestamp)object);
}
}
}
//構造數據
private static List<Emp> initData() {
List<Emp> emps = new ArrayList<Emp>();
Emp emp;
for(int i=0;i<3;i++){
emp = new Emp(i,UUID.randomUUID().toString(),new Timestamp(System.currentTimeMillis()));
emps.add(emp);
}
return emps;
}
}
package ref.model;
import java.sql.Timestamp;
import ref.annotation.ExcelField;
public class Emp {
@ExcelField(key = "編號")
public Integer id;
@ExcelField(key = "名字")
public String name;
@ExcelField(key = "創建時間")
public Timestamp createTime;
public Emp(Integer id, String name, Timestamp createTime) {
super();
this.id = id;
this.name = name;
this.createTime = createTime;
}
}
package ref.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//@Target,約束之用,告訴計算機,此注解可以被放在哪些元素之前
@Target({
ElementType.FIELD,
ElementType.METHOD
})
//@Retention,告訴計算機,此注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelField {
String key();
}
說說我的看法吧。泛型之所以會寫在類名後面,那是因為這個泛型貫穿了整個類,是這個類的一個很重要的類型。但明顯 T 不是,它僅僅就被使用了一次,然後這個V感覺也沒什麼用。所以如果T的確是某個成員變量的類型,你可以定義到類名後面。
第二個//這個獲取的是Emp類型 t是一個對象 由t可以獲取t的class對象。由class對象可以獲得t的類的屬性。通過field.get(t) 傳入一個對象。
相當於就是t.getXX(); 這個方法的效果就是這樣。。
T t = list.get(i);
//這個是Emp的屬性數組
Field[] fields = t.getClass().getFields();
for (Field field : fields) {
//field這是屬性
//field.get(t) 這句話我就不理解了
//為什麼屬性獲取Emp類,可以獲取到屬性的值
Object object = field.get(t);
/*------------沒看懂代碼片-結束--------------*/