摘要:盡管普遍認(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)私有屬性需要調(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)類私有方法需要調(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ò)反射獲取構(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...
摘要:通過(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.反射的...
摘要:在的反射包中提供了三個(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è)合...
摘要:可以通過(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),包含此類中的方法定...
閱讀 4155·2023-04-26 01:48
閱讀 3312·2021-10-13 09:40
閱讀 1768·2021-09-26 09:55
閱讀 3682·2021-08-12 13:23
閱讀 1893·2021-07-25 21:37
閱讀 3462·2019-08-30 15:53
閱讀 1426·2019-08-29 14:16
閱讀 1423·2019-08-29 12:59