1. 程式人生 > >轉:用反射呼叫物件的私有屬性和方法(經典)

轉:用反射呼叫物件的私有屬性和方法(經典)

大家都知道正常的呼叫是不可以訪問物件的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中WSGIRequestHttpRequest物件常用屬性方法

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