首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 內省機制中 `!"class".equals(pd.getName())` 詳細解析

     編輯:程式設計綜合問答

代碼上下文

PropertyDescriptor[] pds = info.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
    if (!"class".equals(pd.getName())) {
        Method m = pd.getWriteMethod();
        m.invoke(user, "admin");
    }
}

表達式拆解

  1. pd.getName():獲取 JavaBean 屬性名稱 (如 "username", "password", "class")。
  2. "class".equals(pd.getName()):安全比較,判斷屬性名是否為 "class"。將常量放左邊避免 pd.getName() 為 null 時拋 NPE。
  3. !:邏輯非運算符,取反。
  4. 整體含義:過濾掉名為 "class" 的屬性。

為什麼要過濾 "class"?

Introspector.getBeanInfo() 會返回所有屬性描述符,包含繼承自 Object 的 `getClass()` 方法對應的 "class" 屬性。該屬性:

  • 只有 getter (getClass()),沒有 setter。
  • pd.getWriteMethod() 返回 null。
  • 調用 m.invoke(...) 會拋 NullPointerException。

最佳實踐改進

for (PropertyDescriptor pd : pds) {
    Method writer = pd.getWriteMethod();
    if (writer != null && !"class".equals(pd.getName())) {
        try {
            writer.invoke(user, "admin");
        } catch (Exception e) {
            log.warn("設置屬性失敗: " + pd.getName(), e);
        }
    }
}
  • 優先判空 writer != null,更通用地過濾無寫入器屬性。
  • 捕獲單個屬性異常,不影響其他屬性設置。

擴展知識:PropertyDescriptor 核心屬性

方法說明
getName()屬性名 (首字母小寫)
getReadMethod()getter Method 對象
getWriteMethod()setter Method 對象
getPropertyType()屬性類型 Class 對象

總結

!"class".equals(pd.getName()) 是 Java 內省編程中過濾 Object 繼承屬性的慣用寫法,配合 getWriteMethod() != null 可構建健壯的屬性批量賦值工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved