最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

反射機制:getDeclaredField和getField的區(qū)別說明

 更新時間:2021年06月30日 11:05:35   作者:Apple_羊先森  
這篇文章主要介紹了反射機制:getDeclaredField和getField的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

getDeclaredField和getField區(qū)別

在做后臺開發(fā)時實體的固定字段一般會抽取為一個父類,其他類繼承該父類,例如主鍵字段,會放到一個父類中(IdEntity),其他類繼承該類,但是我們在操作時操作的是子類,在通過子類獲取父類屬性是getDeclaredField和getField是不一樣的,簡單說

1、getDeclaredFiled 僅能獲取類本身的屬性成員(包括私有、共有、保護)

2、getField 僅能獲取類(及其父類可以自己測試) public屬性成員

因此在獲取父類的私有屬性時,要通過getSuperclass的之后再通過getDeclaredFiled獲取。

父類,出去id作為父類字段

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass; 
import org.hibernate.annotations.GenericGenerator;
@MappedSuperclass
public abstract class IdEntity {
	private String id; 
	@Id
	@GeneratedValue(generator = "paymentableGenerator")
	@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
	@Column(name ="ID",nullable=false,length=32)
	public String getId() {
		return id;
	} 
	public void setId(String id) {
		this.id = id;
	} 
}

子類

public class Reflect extends IdEntity { 
 public String publicField;
 private String privateField; 
 public Reflect(String publicField, String privateField) {
  super();
  this.publicField = publicField;
  this.privateField = privateField;
 } 
 public String getPrivateField() {
  return privateField;
 } 
 public void setPrivateField(String privateField) {
  this.privateField = privateField;
 } 
}

測試類:

import java.lang.reflect.Field; 
public class ReflectDemo { 
 /**
  * @Description: TODO
  * @param @param args
  * @return void
  * @throws SecurityException
  * @throws NoSuchFieldException
  * @throws IllegalAccessException
  * @throws IllegalArgumentException
  * @throws
  * @author ydecai
  * @date 2019-1-23
  */
 public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
  Reflect re = new Reflect("zhangsan", "lisi");
  re.setId("111");
  //getDeclaredFiled獲取本類屬性
//  Field publicField = re.getClass().getDeclaredField("publicField");
//  System.out.println(publicField.get(re));
  Field publicField = re.getClass().getField("publicField");
  System.out.println(publicField.get(re));
  //getField獲取公有屬性,包括父類的,下面語句報錯
  //Field privateField = re.getClass().getField("privateField");
  Field privateField = re.getClass().getDeclaredField("privateField");
  privateField.setAccessible(true);
  System.out.println(privateField.get(re));
  //獲取父類私有屬性并獲取值
  Field fileId = re.getClass().getSuperclass().getDeclaredField("id");
  fileId.setAccessible(true);
  System.out.println(fileId.get(re));
 } 
}

getDeclaredField方法與NoSuchFieldException異常

使用getDeclaredField()方法,發(fā)現有異常NoSuchFieldException,后續(xù)發(fā)現是因為實體類使用了extends引起的,就百度了下原因。

發(fā)現getDeclaredField()方法只能獲取當前類的所有屬性,但是不能獲取父類的屬性

這里引出兩個問題

第一個問題:getField()和getDeclaredField()方法是做什么的:

用Class的getField(String name)或getDelaredField(String name)是用來得到目標類的指定屬性,返回類型是Field。

第二個問題:getField()和getDeclaredField()方法有什么區(qū)別:

getField(String name)只能獲取public的字段,包括父類的;

而getDeclaredField(String name)只能獲取自己聲明的各種字段,包括public,protected,private。

那么解決我遇到的問題有幾種方法:

方法1:棄用extends,但是我如果還想繼續(xù)使用extends怎么辦呢,看方法2。

方法2:可以通過getSuperclass()方法獲取父類,再調用getDeclaredField()方法。

Field field;
try {
   field = obj.getClass().getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
   //此處用于解決繼承導致的getDeclaredField不能直接獲取父類屬性的問題
   field = obj.getClass().getSuperclass().getDeclaredField(fieldName);
}
 

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • spring緩存cache的使用詳解

    spring緩存cache的使用詳解

    這篇文章主要介紹了spring緩存cache的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring Boot mybatis-config 和 log4j 輸出sql 日志的方式

    Spring Boot mybatis-config 和 log4j 輸出sql 日志的方式

    這篇文章主要介紹了Spring Boot mybatis-config 和 log4j 輸出sql 日志的方式,本文通過實例圖文相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • Spring事務失效的場景梳理總結

    Spring事務失效的場景梳理總結

    實際項目開發(fā)中,如果涉及到多張表操作時,為了保證業(yè)務數據的一致性,大家一般都會采用事務機制,好多小伙伴可能只是簡單了解一下,遇到事務失效的情況,便會無從下手,下面這篇文章主要給大家介紹了關于Spring事務失效場景的相關資料,需要的朋友可以參考下
    2023-02-02
  • IDEA 集成log4j將SQL語句打印在控制臺上的實現操作

    IDEA 集成log4j將SQL語句打印在控制臺上的實現操作

    這篇文章主要介紹了IDEA 集成log4j將SQL語句打印在控制臺上的實現操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • shiro攔截認證的全過程記錄

    shiro攔截認證的全過程記錄

    Apache?Shiro是一個強大且易用的Java安全框架,執(zhí)行身份驗證、授權、密碼和會話管理,下面這篇文章主要給大家介紹了關于shiro攔截認證的相關資料,需要的朋友可以參考下
    2021-11-11
  • Java用for循環(huán)Map詳細解析

    Java用for循環(huán)Map詳細解析

    本篇文章主要介紹了Java用for循環(huán)Map,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • idea中創(chuàng)建jsp項目的詳細實戰(zhàn)步驟

    idea中創(chuàng)建jsp項目的詳細實戰(zhàn)步驟

    才學javaWeb,以防自己忘記創(chuàng)建項目的過程,所以淺淺的記錄一下吧,下面這篇文章主要給大家介紹了關于idea中創(chuàng)建jsp項目的詳細步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • SpringBoot解決yml明文密碼問題的方法

    SpringBoot解決yml明文密碼問題的方法

    在現代的軟件開發(fā)中,安全性是一個重要的考量因素,對于使用SpringBoot框架開發(fā)的應用程序而言,敏感信息如數據庫密碼、API密鑰等通常存儲在YAML配置文件中,而這些文件往往是明文存儲,存在安全隱患,所以本文介紹了SpringBoot解決yml明文密碼問題的方法
    2024-07-07
  • Java Lambda表達式與匿名內部類的聯系和區(qū)別實例分析

    Java Lambda表達式與匿名內部類的聯系和區(qū)別實例分析

    這篇文章主要介紹了Java Lambda表達式與匿名內部類的聯系和區(qū)別,結合實例形式分析了Java Lambda表達式與匿名內部類功能、用法、區(qū)別及操作注意事項,需要的朋友可以參考下
    2019-10-10
  • window?下?win10?jdk8安裝與環(huán)境變量的配置過程

    window?下?win10?jdk8安裝與環(huán)境變量的配置過程

    這篇文章主要介紹了window?下?win10?jdk8安裝與環(huán)境變量的配置,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08

最新評論

柏乡县| 武功县| 都兰县| 雷州市| 静安区| 获嘉县| 会东县| 武功县| 新巴尔虎左旗| 建水县| 岢岚县| 延吉市| 淅川县| 沅陵县| 姚安县| 石渠县| 大方县| 昭平县| 兴文县| 台山市| 宁国市| 抚顺县| 藁城市| 眉山市| 肃南| 佛教| 勐海县| 彭泽县| 循化| 县级市| 平昌县| 尉犁县| 内江市| 柘荣县| 黄龙县| 玛沁县| 瑞昌市| 阿克苏市| 银川市| 松江区| 南充市|