成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java反射-私有屬性和方法

Sleepy / 1305人閱讀

摘要:盡管普遍認(rèn)知是,實(shí)際可以通過(guò)反射訪問(wèn)其他類的私有屬性和方法。這個(gè)特性在單元測(cè)試中特別有用。注意這只能在單體應(yīng)用程序中運(yùn)行,比如單元測(cè)試和常規(guī)程序。注意已經(jīng)有很多關(guān)于禁用反射訪問(wèn)類私有屬性的討論。調(diào)用將關(guān)閉實(shí)例的訪問(wèn)權(quán)限檢查,僅用于反射。

盡管普遍認(rèn)知是,實(shí)際可以通過(guò)反射訪問(wèn)其他類的私有屬性和方法。它甚至并不難。這個(gè)特性在單元測(cè)試中特別有用。本文將告訴你如何做。
注意:這只能在單體Java應(yīng)用程序中運(yùn)行,比如單元測(cè)試和常規(guī)程序。如果你嘗試在Java Applet程序中使用,可能需要注意SecurityManager問(wèn)題。但是,你并不常做這些操作,并且到目前為止已偏離了本文主題。
注意:已經(jīng)有很多關(guān)于Java9禁用反射訪問(wèn)類私有屬性的討論。根據(jù)我的經(jīng)歷,在Java9依舊是可以的(訪問(wèn)類私有屬性),但這可能會(huì)在Java未來(lái)版本中改變。

訪問(wèn)私有屬性

訪問(wèn)私有屬性需要調(diào)用Class.getDeclaredField(String name)或者Class.getDeclaredFields()方法。方法Class.getField(String name) Class.getFields()只返回類的public方法,所以不能使用它們。下面的示例代碼是一個(gè)有私有屬性的類,再下一個(gè)是通過(guò)反射訪問(wèn)私有屬性。

public class PrivateObject {

  private String privateString = null;

  public PrivateObject(String privateString) {
    this.privateString = privateString;
  }
}
PrivateObject privateObject = new PrivateObject("The Private Value");

Field privateStringField = PrivateObject.class.
            getDeclaredField("privateString");

privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

示例代碼會(huì)輸出“fieldValue = The Private Value”,它是PrivateObject實(shí)例的privateString屬性的值。
使用方法privateObject.class.getDeclaredField("privateString")時(shí)需要注意。這個(gè)方法返回私有屬性。這個(gè)方法只返回特定類定義的屬性,不包括任何超類的屬性。
另外需要注意代碼privateStringField.setAccessible(true);。調(diào)用這個(gè)方法將為特定的Field實(shí)例關(guān)閉訪問(wèn)權(quán)限檢查,僅用于反射。現(xiàn)在你可以訪問(wèn)屬性,不管它是private, protected 或者package scope,即使調(diào)用方不在訪問(wèn)scope內(nèi)。你依舊不能使用普通代碼訪問(wèn)私有屬性,Java編譯通不過(guò)。

訪問(wèn)私有方法

訪問(wèn)類私有方法需要調(diào)用Class.getDeclaredMethod(String name, Class[] parameterTypes)或者Class.getDeclaredMethods()。方法Class.getMethod(String name, Class[] parameterTypes)Class.getMethods() 只返回類的public方法,所以不能使用。下面是一個(gè)有私有方法的類和如何通過(guò)反射調(diào)用該類方法的私有代碼:

public class PrivateObject {

  private String privateString = null;

  public PrivateObject(String privateString) {
    this.privateString = privateString;
  }

  private String getPrivateString(){
    return this.privateString;
  }
}
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);

示例代碼會(huì)輸出"returnValue = The Private Value",這是實(shí)例PrivateObject中的方法getPrivateString()的返回值。
注意,代碼PrivateObject.class.getDeclaredMethod("privateString")。這個(gè)方法調(diào)用將返回類的私有方法。這個(gè)方法只返回類直接定義的方法,而不返回任何超類的方法。
另外需要注意代碼privateStringMethod.setAccessible(true);。調(diào)用Method.setAcessible(true)將關(guān)閉Method實(shí)例的訪問(wèn)權(quán)限檢查,僅用于反射?,F(xiàn)在你可以調(diào)用方法,不論它是private, protected 或 package scope,即使調(diào)用者不在這些scopes內(nèi)。你依舊不能通過(guò)普通方法訪問(wèn)類的私有方法,這會(huì)編譯不通過(guò)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77339.html

相關(guān)文章

  • Java 反射

    摘要:反射的使用通過(guò)反射獲取構(gòu)造方法并使用首先我們聲明一個(gè)類方便我們進(jìn)行介紹默認(rèn)的構(gòu)造方法默認(rèn)的構(gòu)造方法無(wú)參構(gòu)造方法調(diào)用了公有無(wú)參構(gòu)造方法執(zhí)行了。。。 1.概述 1.1 什么是反射 java反射機(jī)制是指在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法,對(duì)于任意一個(gè)對(duì)象,都能調(diào)用它的任意一個(gè)方法和屬性,這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制。 1...

    nodejh 評(píng)論0 收藏0
  • Java反射詳細(xì)介紹

    摘要:通過(guò)反射獲取帶參無(wú)返回值成員方法并使用設(shè)置安全檢查,訪問(wèn)私有構(gòu)造函數(shù)必須創(chuàng)建實(shí)例這種不行,注意和方法需要傳遞參數(shù)測(cè)試復(fù)制這個(gè)功能獲取私有方法,同樣注意和的區(qū)別賦予訪問(wèn)權(quán)限調(diào)用方法。 反射 目錄介紹 1.反射概述 1.1 反射概述 1.2 獲取class文件對(duì)象的三種方式 1.3 反射常用的方法介紹 1.4 反射的定義 1.5 反射的組成 1.6 反射的作用有哪些 2.反射的...

    ingood 評(píng)論0 收藏0
  • Java反射

    摘要:中的反射反射能夠分析類所擁有的能力的程序稱為反射。獲取類的名稱獲取類的修飾符獲取類所在的包獲取父類的屬性獲取類的構(gòu)造器等等獲得的構(gòu)造器的使用獲取構(gòu)造器有兩種方法。 Java中的反射 反射:能夠分析類所擁有的能力的程序稱為反射。 反射的作用 當(dāng)我們?cè)谑褂靡粋€(gè)已有的類的時(shí)候,在主代碼的main()方法中使用別的已有的類的時(shí)候,如果被使用的類發(fā)生了改變,那么導(dǎo)致我們的main()方法中...

    張紅新 評(píng)論0 收藏0
  • 一文帶你了解Java反射機(jī)制

    摘要:在的反射包中提供了三個(gè)類以及來(lái)分別描述屬性方法和構(gòu)造器。獲取構(gòu)造器獲取方法可以看到我們可以通過(guò)一個(gè)類的對(duì)象很輕松的獲取他的屬性構(gòu)造器以及方法信息。返冋一個(gè)用于描述構(gòu)造器名的字符串。 想要獲取更多文章可以訪問(wèn)我的博客?-?代碼無(wú)止境。 上周上班的時(shí)候解決一個(gè)需求,需要將一批數(shù)據(jù)導(dǎo)出到Excel。本來(lái)公司的中間件組已經(jīng)封裝好了使用POI生成Excel的工具方法,但是無(wú)奈產(chǎn)品的需求里面有個(gè)合...

    darcrand 評(píng)論0 收藏0
  • 胖哥說(shuō)反射 上卷

    摘要:可以通過(guò)提供的方法,獲取對(duì)象,具體如下方法返回值方法名稱方法說(shuō)明返回一個(gè)指定參數(shù)的對(duì)象,該對(duì)象反映此對(duì)象所表示的類或接口的指定已聲明方法。 我來(lái)學(xué)習(xí)反射 1.為什么我們要學(xué)習(xí)反射? 通過(guò)反射機(jī)制可以獲取到一個(gè)類的完整信息,例如:所有(包含private修飾)屬性和方法,包信息等。 換句話說(shuō),Class本身表示一個(gè)類的本身,通過(guò)Class可以完整獲取一個(gè)類中的完整結(jié)構(gòu),包含此類中的方法定...

    hedzr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<