1. 程式人生 > >Java 私有變數和私有方法

Java 私有變數和私有方法

作者: Jakob Jenkov 譯者:葉文海([email protected]

內容索引

  1. 訪問私有變數
  2. 訪問私有方法

在通常的觀點中從物件的外部訪問私有變數以及方法是不允許的,但是 Java 反射機制可以做到這一點。使用這個功能並不困難,在進行單元測試時這個功能非常有效。本節會向你展示如何使用這個功能。

注意:這個功能只有在程式碼執行在單機 Java 應用(standalone Java application)中才會有效,就像你做單元測試或者一些常規的應用程式一樣。如果你在 Java Applet 中使用這個功能,那麼你就要想辦法去應付 SecurityManager 對你限制了。但是一般情況下我們是不會這麼做的,所以在本節裡面我們不會探討這個問題。

訪問私有變數

要想獲取私有變數你可以呼叫 Class.getDeclaredField(String name)方法或者 Class.getDeclaredFields()方法。

Class.getField(String name)和 Class.getFields()只會返回公有的變數,無法獲取私有變數。下面例子定義了一個包含私有變數的類,在它下面是如何通過反射獲取私有變數的例子:

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);

這個例子會輸出”fieldValue = The Private Value”,The Private Value 是 PrivateObject 例項的 privateString 私有變數的值,注意呼叫 PrivateObject.class.getDeclaredField(“privateString”)方法會返回一個私有變數,這個方法返回的變數是定義在 PrivateObject 類中的而不是在它的父類中定義的變數。 注意 privateStringField.setAccessible(true)這行程式碼,通過呼叫 setAccessible()方法會關閉指定類 Field 例項的反射訪問檢查,這行程式碼執行之後不論是私有的、受保護的以及包訪問的作用域,你都可以在任何地方訪問,即使你不在他的訪問許可權作用域之內。但是你如果你用一般程式碼來訪問這些不在你許可權作用域之內的程式碼依然是不可以的,在編譯的時候就會報錯。

訪問私有方法

訪問一個私有方法你需要呼叫 Class.getDeclaredMethod(String name, Class[] parameterTypes)或者 Class.getDeclaredMethods() 方法。 Class.getMethod(String name, Class[] parameterTypes)和 Class.getMethods()方法,只會返回公有的方法,無法獲取私有方法。下面例子定義了一個包含私有方法的類,在它下面是如何通過反射獲取私有方法的例子:

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);

這個例子會輸出”returnValue = The Private Value”,The Private Value 是 PrivateObject 例項的 getPrivateString()方法的返回值。 PrivateObject.class.getDeclaredMethod(“privateString”)方法會返回一個私有方法,這個方法是定義在 PrivateObject 類中的而不是在它的父類中定義的。 同樣的,注意 Method.setAcessible(true)這行程式碼,通過呼叫 setAccessible()方法會關閉指定類的 Method 例項的反射訪問檢查,這行程式碼執行之後不論是私有的、受保護的以及包訪問的作用域,你都可以在任何地方訪問,即使你不在他的訪問許可權作用域之內。但是你如果你用一般程式碼來訪問這些不在你許可權作用域之內的程式碼依然是不可以的,在編譯的時候就會報錯。

本文連結地址: <a rel="nofollow" href="http://ifeve.com/java-reflection-7/" "="" style="box-sizing: border-box; color: rgb(45, 133, 202); text-decoration: none; background-color: transparent;">Java Reflection(七):私有變數和私有方法

相關推薦

Java Reflection(七):私有變數私有方法

原文地址 作者: Jakob Jenkov 譯者:葉文海([email protected]) 內容索引 訪問私有變數 訪問私有方法 在通常的觀點中從物件的外部訪問私有變數以及方法是不允許的,但是Java反射機制可以做到這一點。使用這個功能並不困難,在進行單元測試時這個功能非常有效。

Java 私有變數私有方法

作者: Jakob Jenkov 譯者:葉文海([email protected]) 內容索引 訪問私有變數訪問私有方法 在通常的觀點中從物件的外部訪問私有變數以及方法是不允許的,但是 Java 反射機制可以做到這一點。使用這個功能並不困難,在進行單元測試時這個功能非常有效。本節會向你展示如何

利用java反射機制,實現對類的私有變數私有方法的訪問

記得有一句很有名的話:No reflection ,no frameworks 這一句短短的話道出了java 反射機制的強大。 java關於反射機制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基於java的反射機制。 下面是一個關於利用j

python 類的私有變數私有方法介紹

版權宣告:博主原創文章,轉載請註明來源,謝謝合作!! https://mp.csdn.net/mdeditor/84438578 預設情況下,Python中的成員函式和成員變數都是公開的(public),在python中沒有類似public,private等關鍵詞來修飾成員

iOS開發私有變數私有方法

oc中有私有變數,沒有私有犯法,但是嚴格來說沒有絕對的私有變數和私有方法 私有變數: oc中提供了關鍵字@private來宣告私有變數,只允許本類訪問 私有方法: oc中沒有提供關鍵字來宣告私有方法,可以通過catogry的匿名類E

java靜態變數靜態方法優缺點

java靜態變數和靜態方法會在程式初始化執行時候就載入到記憶體。 優點:不需要在進行例項化。靜態變數的值,直接賦新值即可,不需要引數傳遞,之後可以直接進行引數引用即可;靜態方法可以直接通過"類名.方法

Java 中子類是否只繼承父類的非私有變數方法

今天在 CSDN 論壇中見到有人問在 Java 中子類是否只繼承父類的非私有變數和方法(原貼在此)。大部分跟貼都認為這句話是正確的,但是對於這個問題背後的本質理解卻是錯誤的。首先我們明確一下“繼承”一詞的概念,在 Java 中,繼承一詞的意義是有限制的。一個子類只能繼承其父類

java訪問類的私有變數方法

import java.lang.reflect.Field;   import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; class A {       pr

Ruby中的反射(Reflection)- 操作成員變數私有方法(完)

上一篇文章我們說到了Ruby中的反射(Reflection)-通過類名稱構造類物件。 使用過Java反射的同學們都知道,有了物件之後,操作成員變數和私有方法也就不在話下了。 Ruby中也是一樣。 先看操作成員變數的例子。我們嘗試更改一個成員變數的值。(接著上一片文章的程式碼) #manpulate

Python 面向對象 --- 私有屬性私有方法

處理 %d com 私有 訪問 class 無法 self. inf 01,應用場景及定義方式 應用場景 在實際開發中,對象 的 某些屬性或方法 可能只希望 在對象的內部被使用,而 不希望被外部訪問到 私有屬性 就是 對象 不希望公開的 屬性 私有方法 就是 對象 不希望

Python_從零開始學習_(38) 私有屬性私有方法

1.  應用場景及定義方式 應用場景 在實際開發中,  物件 的 某些屬性或方法 可能只希望 在物件的內部被使用, 而 不希望在外部被訪問到 私有屬性 就是 物件&nbs

JS私有變數靜態私有變數

1.私有變數 function myObject() { var privateVariable = 10; function privateFun() { return false; } this.publicMethod = function(

跟老齊學Python之私有函式專有方法

在任何語言中,都會規定某些物件(屬性、方法、函式、類等)只能夠在某個範圍內訪問,出了這個範圍就不能訪問了。這是“公”、“私”之分。此外,還會專門為某些特殊的東西指定一些特殊表示,比如類的名字就不能用class,def等,這就是保留字。除了保留字,python中還為類的名字做了某些特殊準備,就是“專有

Java的靜態變數靜態方法

總結一下,靜態變數和非靜態變數、靜態方法和非靜態方法的區別。 靜態變數和非靜態變數: 靜態變數是屬於類的,在類載入時直接初始化,並且是在類的任何物件創造之前就完成初始化,同一類的所有例項也都共享同一個靜態變數;而非靜態變數是屬於物件(例項)的,例項化時才被分配記憶體空間。它們的訪問方式:靜態變數

面向物件程式設計-私有屬性私有方法

1.私有屬性 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:James Tao 4 class Role(object):#執行時之後就存在記憶體裡 5 6 #建構函式 7 #作用:在例項化時做一

Java內部類(3):非靜態內部類為什麼不能有靜態成員變數靜態方法

首先要明白以下三點: static型別的屬性和方法,在類載入的時候就會存在於記憶體中。 要想使用某個類的static屬性和方法,那麼這個類必須要載入到虛擬機器- 中。 非靜態內部類並不隨外部類一起載入,只有在例項化外部類之後才會載入。 現在考慮這個情

使用java反射操作類的建構函式,成員變數成員方法

在java.lang.reflect包中有三個類Field,Method,Constructor.分別描述域,方法,構造器。參考API,關於這三個類的說明。 在執行時使用反射分析物件,如果訪問的是私有域或是私有方法,私有建構函式,會丟擲IllegalAccessExce

Java中成員變數成員方法的使用

package g.practise_myself; /*作者:陳天祥   時間:2016.10.7   功能:成員變數和成員方法的使用   */ import java.io.*; public class Object  {public static void main

python - 私有屬性私有方法

私有屬性和私有方法 應用場景及定義方式 應用場景 在實際開發中,物件的某些屬性或方法可能只希望在物件的內部使用,而不希望在外部被訪問到 私有屬性 就是 物件 不希望公開的 屬性 私有方法 就是 方法 不希望公開的 方法 定義方法 在定義屬性或方法時,在屬性名或者方法名前增加兩個下劃線,定義的

class定義私有屬性私有方法

私有方法和私有屬性,是隻能在類的內部訪問的方法和屬性,外部不能訪問。 但 ES6 不提供,只能通過變通方法模擬實現 下面是私有方法和私有屬性暴露的例子 class Foo { //公有方法 foo (baz) { this._bar(baz); }