欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 反射之私有字段和方法詳細(xì)介紹

 更新時(shí)間:2012年11月26日 12:08:19   作者:  
本文將介紹Java 反射之私有字段和方法的應(yīng)用,需呀了解的朋友可以參考下
盡管我們通常認(rèn)為通過(guò)JAVA的反射機(jī)制來(lái)訪問(wèn)其它類的私有字段和私有方法是可行的,其實(shí)并沒(méi)有那么困難。
注釋:只有在單獨(dú)的JAVA程序中運(yùn)行該代碼才有效,就像你做一些單元測(cè)試或者常規(guī)的程序。如果你嘗試在JAVA APPLET內(nèi)使用該方法,你需要稍稍修改SecurityManager。但是,因?yàn)槟悴皇墙?jīng)常需要與它打交道,這里也就不再贅述了。
這里是本次內(nèi)容的列表:
1.訪問(wèn)私有字段。
2.訪問(wèn)私有方法。
訪問(wèn)私有字段:
為了訪問(wèn)私有字段,你需要調(diào)用Class.getDeclaredField(String name)或者Class.getDeclaredFields()方法。方法Class.getField(String name)和Class.getFields()僅僅返回共有的字段,所以它們都無(wú)法起到作用。這里有一個(gè)例子,該例子中有一個(gè)包含私有字段的類,在該類下面有通過(guò)反射訪問(wèn)私有字段的代碼。
復(fù)制代碼 代碼如下:

public class PrivateObject {
private String privateString = null; //聲明為私有字段
public PrivateObject(String privateString) {
this.privateString = privateString;
}
}

復(fù)制代碼 代碼如下:

PrivateObject privateObject = new PrivateObject("The Private Value");//實(shí)例化對(duì)象
Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);//允許訪問(wèn)私有字段
String fieldValue = (String) privateStringField.get(privateObject);//獲得私有字段值
System.out.println("fieldValue = " + fieldValue);

這個(gè)代碼會(huì)打印出文本"fieldValue = The Private Value",而該值正好是對(duì)象PrivateObject的私有字段privateString的值。
注意到我們使用了方法PrivateObject.class.getDeclaredfield("privateString")。正是這個(gè)調(diào)用這個(gè)方法返回了私有字段。這個(gè)方法僅僅根據(jù)指定的類返回字段,不會(huì)返回父類申明的字段。
另外仔細(xì)觀察加粗的語(yǔ)句。通過(guò)調(diào)用 Field.setAccessible(true),你關(guān)掉了對(duì)于這個(gè)指定字段實(shí)例的訪問(wèn)檢查,僅僅對(duì)反射有效?,F(xiàn)在你能訪問(wèn)它了,不管它是私有的,保護(hù)的或是默認(rèn)的(default),即時(shí)調(diào)用者并不在該范圍中。你仍然不能通過(guò)常規(guī)方法訪問(wèn)該字段,因?yàn)榫幾g器不允許。
訪問(wèn)私有方法
為了訪問(wèn)一個(gè)私有方法,你需要調(diào)用Class.getDeclaredMethod(String name,Class[] parameterTypes)或者Class.getDeclaredMethods()方法。方法Class.getMethod(String name,Class[] parameterTypes)和Class.getMethods()僅僅返回公有方法,所以它們不會(huì)起到作用。下面是一個(gè)簡(jiǎn)單的例子,該例子中有一個(gè)擁有私有方法的類,類下面是通過(guò)反射機(jī)制訪問(wèn)私有方法的代碼。
復(fù)制代碼 代碼如下:

public class PrivateObject {
private String privateString = null;
public PrivateObject(String privateString) {
this.privateString = privateString;
}
private String getPrivateString(){//私有方法
return this.privateString;
}
}

復(fù)制代碼 代碼如下:

PrivateObject privateObject = new PrivateObject("The Private Value");
Method privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
String returnValue = (String)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);

這個(gè)代碼例子會(huì)打印出文本"returnValue = The private Value",該值正好是私有方法的返回值。

相關(guān)文章

  • SpringBoot攔截器實(shí)現(xiàn)登錄攔截的方法示例

    SpringBoot攔截器實(shí)現(xiàn)登錄攔截的方法示例

    這篇文章主要介紹了SpringBoot攔截器實(shí)現(xiàn)登錄攔截的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 如何用JAVA判斷當(dāng)前時(shí)間是否為節(jié)假日、周末、工作日及調(diào)休日(不報(bào)錯(cuò):IOException!)

    如何用JAVA判斷當(dāng)前時(shí)間是否為節(jié)假日、周末、工作日及調(diào)休日(不報(bào)錯(cuò):IOException!)

    最近公司有個(gè)業(yè)務(wù)需要判斷工作日,但是每年的節(jié)假日不一樣,下面這篇文章主要給大家介紹了關(guān)于如何用JAVA判斷當(dāng)前時(shí)間是否為節(jié)假日、周末、工作日及調(diào)休日的相關(guān)資料,且不報(bào)錯(cuò):IOException!,需要的朋友可以參考下
    2023-12-12
  • spring?@Primary-在spring中的使用方式

    spring?@Primary-在spring中的使用方式

    這篇文章主要介紹了spring?@Primary-在spring中的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-01-01
  • 對(duì)Java字符串與整形、浮點(diǎn)類型之間的相互轉(zhuǎn)換方法總結(jié)

    對(duì)Java字符串與整形、浮點(diǎn)類型之間的相互轉(zhuǎn)換方法總結(jié)

    今天小編就為大家分享一篇對(duì)Java字符串與整形、浮點(diǎn)類型之間的相互轉(zhuǎn)換方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 使用java生成字母驗(yàn)證碼

    使用java生成字母驗(yàn)證碼

    這篇文章主要介紹了使用java生成字母驗(yàn)證碼的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java設(shè)計(jì)模式中的迭代器模式詳解

    Java設(shè)計(jì)模式中的迭代器模式詳解

    迭代器模式官方解釋就是提供一個(gè)對(duì)象來(lái)順序訪問(wèn)聚合對(duì)象中的一系列數(shù)據(jù),而不暴露聚合對(duì)象的內(nèi)部表示。何為聚合對(duì)象呢?最典型的就是集合類。大白話也就是,集合中的數(shù)據(jù)是私有的,集合中不應(yīng)該提供直接遍歷的方法,要定義一個(gè)新的對(duì)象用于訪問(wèn)這個(gè)集合
    2023-02-02
  • Java中的反射機(jī)制示例詳解

    Java中的反射機(jī)制示例詳解

    反射就是把Java類中的各個(gè)成分映射成一個(gè)個(gè)的Java對(duì)象。本文將通過(guò)示例詳細(xì)講解Java中的反射機(jī)制,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-03-03
  • Java實(shí)力彈彈球?qū)崿F(xiàn)代碼

    Java實(shí)力彈彈球?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)力彈彈球?qū)崿F(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Struts2學(xué)習(xí)筆記(3)-DMI動(dòng)態(tài)調(diào)用方式

    Struts2學(xué)習(xí)筆記(3)-DMI動(dòng)態(tài)調(diào)用方式

    本文主要介紹Struts2的DMI動(dòng)態(tài)調(diào)用的兩種方式,簡(jiǎn)單實(shí)用,希望能給大家做一個(gè)參考。
    2016-06-06
  • Maven打包后找不到class文件的問(wèn)題

    Maven打包后找不到class文件的問(wèn)題

    本文主要介紹了Maven打包后找不到class文件的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評(píng)論