轉:用反射呼叫物件的私有屬性和方法(經典)
大家都知道正常的呼叫是不可以訪問物件的private修飾的屬性和方法的,這也是java的封裝性原則。
但是有沒有方法可以強制去訪問物件的private修飾的屬性和方法呢?那就是用反射!(這個可能在面試題中被問到哦)
下面這個例子很簡單,就是定義一個dog類,裡面有個private的屬性dogName,和private的方法say。
main函式裡用反射先去修改dogName,然後在呼叫say方法打印出來:
原始碼1:
package com.imooc.reflect; public class Dog { //私有的域 private String dogName="小風"; //私有的方法 private void say(){ System.out.println(dogName+":汪汪~~~"); } }
原始碼2:
package com.imooc.reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; public class DogTest { public static void main(String[] args) throws Exception{ //獲取Dog類的Class物件 Class class1 = Class.forName("com.imooc.reflect.Dog"); //生成物件的例項 Object object = class1.newInstance(); //取得dogName域 Field dogName = class1.getDeclaredField("dogName"); //禁止Field的訪問控制檢查 dogName.setAccessible(true); //將Field的值設為"小強"; dogName.set(object, "小強"); //取得say()方法 Method say = class1.getDeclaredMethod("say", new Class[]{}); //禁止say方法的訪問檢查 say.setAccessible(true); //呼叫say方法 say.invoke(object, new Object[]{}); } }
這裡需要特別注意一個地方:
如果想用反射修改訪問控制檢查的話,獲取Method和Field物件的時候一定要用getDeclaredField和getDeclaredMethod。不要用getField和getMethod。
雖然這兩個方法的引數都是相同的,但不同點在於getMethod和getField只能獲得public修飾的屬性和方法。而getDeclared可以獲取任何型別的屬性和方法,因為這個例子要呼叫私有的屬性和方法,所以要用getDeclaredXX。
相關推薦
轉:用反射呼叫物件的私有屬性和方法(經典)
大家都知道正常的呼叫是不可以訪問物件的private修飾的屬性和方法的,這也是java的封裝性原則。 但是有沒有方法可以強制去訪問物件的private修飾的屬性和方法呢?那就是用反射!(這個可能在面試題中被問到哦) 下面這個例子很簡單,就是定義一個dog類,裡面有個pri
Java 反射呼叫類的屬性和方法(包含父類私有屬性和覆蓋重寫的方法等)
前面介紹了,反射呼叫類的構造方法來建立類的例項物件。一個類的結構包含方法(構造,靜態,非靜態)和屬性(靜態和非靜態)。按照迴圈漸進的方式,接下來,介紹反射類中屬性和普通的方法。 在這裡簡單介紹,反射呼叫屬性和方法會用到的新類,Method類和Field類。
為物件增加屬性和方法()
為物件增加屬性和方法 所有物件除了都會有Object型別的屬性和方法之外,和可以增加自己的屬性和方法。下面依次記寫兩種建立物件例項並新增屬性、方法的程式碼。 第一種: var people = new Object(); people.name = "Vir
JavaScript常用內建物件及其相應屬性和方法(一)
JavaSript物件的型別為Object型別,JavaSript物件分為內建物件和自定義物件。常用的JavaSript內建物件有以下4中:String,Date,Array,Math. String : 主要用於處理字串,常用屬性為length,常用方法如下
Java 反射調用類的屬性和方法(包含父類私有屬性和覆蓋重寫的方法等)
tst set clas declared method ces arr tails net public static void main(String[] args) { //需要訪問的類 PaymentRequest PaymentRequest tPay
python3面向物件(3)私有屬性和方法以及訪問私有屬性和方法的方式
python3中的私有屬性和方法是以__兩個下劃線開頭的: class Woman(object): #定義一個woman類 def __init__(self,name): self.name = name #公有屬性 self
通過java反射機制,獲取物件的屬性和值(包括所有繼承的父類)
java的反射機制提供了兩種方法: getDeclaredFields() :該方法能獲取到本類的所有屬性,包括private,protected和public,但不能獲取到繼承的父類的屬性。 getFields():既能獲取本類的屬性也能得到父類的
Java反射機制獲取/呼叫類的屬性和方法
Java反射機制主要提供了以下功能: 在執行時判斷任意一個物件所屬的類;在執行時構造任意一個類的物件;在執行時判斷任意一個類所具有的成員變數和方法;在執行時呼叫任意一個物件的方法;生成動態代理。 public class Message { public
java反射獲取私有屬性和方法demo
student物件package MaReflection; public class Student { private int num; private String name; static { System.out.println("[執行靜態區塊]");
利用反射操作bean的屬性和方法
兩個 決定 dto epo cts 強制 多選 通過 報表 今天在開發中碰到這樣一個場景:當請求添加項目下的目錄時,傳過來的是一個IndexModel,這個Model裏有關於這個目錄字段的詳細信息,包括基礎報表,實時,漏鬥等信息(這些字段類型都是boolean),對應於頁面
Django中WSGIRequest(HttpRequest)物件常用屬性和方法
Django在接收到http請求之後,會根據http請求攜帶的引數以及報文資訊建立一個WSGIRequest物件,並且作為檢視函式第一個引數傳給檢視函式。也就是我們經常看到的request引數。在這個物件上我們可以找到客戶端上傳上來的所有資訊。這個物件的完整路徑是django.core.ha
js--屬性和方法(私有/公有)
【私有變數】 在物件內部使用’var’關鍵字來宣告,而且它只能被私有函式和特權方法訪問。 【私有方法】 在物件的建構函式裡宣告(或者是通過varfunctionName=function(){…}來定義),它能被特權方法呼叫(包括物件的構造方法)和私有方法呼叫,私有函式只
資料封裝私有屬性和方法
1.私有屬性的封裝 私有屬性的含義是外部不能直接用 例項名.私有屬性名進行訪問,子類同樣也是一樣不能訪問, 這樣就是對資料進行封裝。只能用公共的方法裡呼叫私有屬性。 請看下這個例子`` class Date: def __init__(self,birt
通過super呼叫父類屬性和方法
class Person{ String name; int age; //父類的構造方法 public Person() { } public String talk() { return "i
《head first java》類、物件、屬性和方法的關係
類的定義:類是對某一類事物的描述,是抽象的、概念上的意義。 屬性表示類的特性,如 類——冰箱 屬性——價格、耗電量、體積 方法表示類的功能,類能做什麼,如 類——冰箱 方法——儲存、冷凍等 類需要通過class來宣告 class 類名稱{ 屬性 方法 } 函
document物件的屬性和方法
document屬性:activeElement = [object]alinkColor = #0000ffall = [object]anchors = [object]applets = [object]attributes = nullbgColor = #33669
PHPUnit測試私有屬性和方法
一、測試類中的私有方法: class Sample { private $a = 0; private function run() { echo $a; } } 上面只是簡單的寫了一個類包含,一個私有
javaScript中私有屬性和方法
javaScript並沒有特殊的語法來表示私有、保護、或公共屬性和方法,在這一點上與 java或其他語言是不同的,JavaScript中所有物件的成員是公用的: var myobj={ mypop:1, getProp:function(){
python中子類不能繼承父類的私有屬性和方法
#在子類中是不能繼承私有屬性和方法的, #但是私有屬性和方法可以在同一個類中被呼叫 class Person(object): def __init__(self,name): self.__name = name self._age = 12
Document物件常用屬性和方法
物件屬性document.title //設定文件標題等價於HTML的title標籤document.bgColor //設定頁面背景色docume