首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 反射實現通用 List 物件屬性提取,輕鬆導出 CSV

     編輯:Java 相關知識

場景痛點

專案需導出 CSV,但 List 中物件型別不固定,無法硬編碼 getter。利用反射可動態獲取任意物件的所有欄位值。

核心代碼

package com.hb.test;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) throws Exception {
        Person p1 = new Person("111", "aaa");
        Person p2 = new Person("222", "bbb");
        List<Object> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        exportCsv(list);
    }

    public static void exportCsv(List<Object> list) throws Exception {
        for (Object obj : list) {
            Field[] fields = obj.getClass().getDeclaredFields();
            for (Field field : fields) {
                if (!field.isAccessible()) {
                    field.setAccessible(true); // 破壞私有封裝
                }
                Object value = field.get(obj);
                System.out.print(value + "\t");
            }
            System.out.println();
        }
    }
}

class Person {
    private String id;
    private String name;
    public Person(String id, String name) {
        this.id = id;
        this.name = name;
    }
}

關鍵點解析

  1. getDeclaredFields():取得類別宣告的所有欄位(含 private),不含繼承欄位。
  2. setAccessible(true):繞過 Java 存取控制,讀取私有欄位。
  3. field.get(obj):從具體物件實例獲取欄位值。

擴充應用:通用 CSV 導出工具

public static <T> void writeCsv(List<T> data, Writer writer) throws Exception {
    if (data.isEmpty()) return;
    Field[] fields = data.get(0).getClass().getDeclaredFields();
    // 寫表頭
    for (int i = 0; i < fields.length; i++) {
        if (i > 0) writer.write(",");
        writer.write(fields[i].getName());
    }
    writer.write("\n");
    // 寫資料
    for (T obj : data) {
        for (int i = 0; i < fields.length; i++) {
            if (i > 0) writer.write(",");
            fields[i].setAccessible(true);
            Object val = fields[i].get(obj);
            writer.write(val != null ? val.toString() : "");
        }
        writer.write("\n");
    }
}

注意事項

  • 反射效能較低,大量資料建議改用編碼生成或庫(如 Apache Commons CSV)。
  • 需處理巢狀物件、集合欄位等複雜型別。
  • 生產環境請加入安全性檢查(SecurityManager)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved