1. 程式人生 > >Java 在外部類中呼叫其它類的私有方法--反射(Reflection)

Java 在外部類中呼叫其它類的私有方法--反射(Reflection)

轉載請註明來自我的CSDN部落格:黃朝輝的部落格
首先,我們看一下什麼是反射,以下Oracle官網上對反射的說明:

Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine. This is a relatively advanced feature and should be used only by developers who have a strong grasp of the fundamentals of the language. With that caveat in mind, reflection is a powerful technique and can enable applications to perform operations which would otherwise be impossible.

譯:反射通常被用在那些需要能檢查或者修改執行在Java虛擬機器中應用程式的執行時行為的程式中。這是一個相對高階的特性,應該只被那些對該語言的基本原理有著比較深的理解的開發者所使用。注意以上警告,反射是一個有力的技術,能用來進行一些其它技術實現不了的操作。(翻譯得比較渣,大神勿怪啊

下面我們通過反射來實現在外部類中呼叫其它類的私有方法。
我們在Main類的main方法裡來,來呼叫ReflectionTester類的print方法。
以下是ReflectionTester類,我們可以看見裡面只有一個私有的print方法。
ReflectionTester類

package cn.sehzh;

public
class ReflectionTester { private void print() { System.out.println("private print method was called!"); } }

Main類

package cn.sehzh;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
public static void main(String[] args) { try { //獲得ReflectionTester類 Class c = Class.forName("cn.sehzh.ReflectionTester"); //獲得ReflectionTester的構造器 Constructor ct = c.getConstructor(null); //建立ReflectionTester類的一個例項 Object test = ct.newInstance(null); //獲得print方法 Method printMethod = c.getDeclaredMethod("print", null); //允許私有方法的呼叫 printMethod.setAccessible(true); //呼叫test物件的print方法 printMethod.invoke(test, null); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

執行結果:
執行結果
注意:

            //獲得print方法
            Method printMethod = c.getDeclaredMethod("print", null);

這裡不能使用getMethod方法,getMethod方法對私有方法沒用。

            //允許私有方法的呼叫
            printMethod.setAccessible(true);

必須要加上這一句才能呼叫私有方法。

相關推薦

Java部類呼叫其它私有方法--反射Reflection

轉載請註明來自我的CSDN部落格:黃朝輝的部落格 首先,我們看一下什麼是反射,以下Oracle官網上對反射的說明: Reflection is commonly used by programs which require the ability to

部類呼叫部類

概念及特性: 內部類        類與類之間除了繼承關係之外,還存在巢狀關係,即一個類可以宣告包含另一個類,被包含的類稱為內部類(inner class),包含內部類的類稱為外部類,此時內部類成為外部類的成員。 Java不支援C++語言的結構(struct)型別,當實際應

在子呼叫方法

在子類中呼叫父類的方法 class Vehicle: Country='China' def __init__(self,name,speed,load,power): self.name=name self.speed=speed se

標準C++的string的用法總結

spa 大小 它的 world 包括 文本 語法 ner append() 轉自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用過MFC編程的朋友對CString這個類的印象應該

Ruby反射Reflection-通過名稱構造物件

在Java語言中,提供了發射機制,通過發射機制可以通過字串構造出這個物件,可以獲取物件的所有方法(包括私有方法),可以呼叫私有方法,可以更改成員變數的值(包括私有的成員變數)。 Ruby也是面向物件的高階語言,當然也提供了反射機制,今天我們討論通過類名稱構造類物件的功能。 我們先看普通的構造: m

Ruby反射Reflection- 操作成員變數和私有方法

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

引用呼叫方法 反射和轉型

如果父類引用指向子類物件, Class A{} Class B extends A{ public void f(){ } } // A a = new B(); 引用要呼叫子類的方法,那麼有兩種方法: #### 向下轉型

java學習之路 之 高階特性2-介面interface-練習題

// 介面通常用形容詞來描述 , 用以描述一種能力. public interface Flyer { // 介面 : 是對事物行為的抽象定義, 介面中只允許抽象方法,和全域性常量 public static final int num = 10;

Java反射reflection和代理proxy

Java中的反射和代理 特別宣告:本文主要是記錄了學習反射和代理的學習過程,代理部分的大段文字均屬轉載。您可以閱讀原文。除此之外,所有程式碼及反射部分均屬個人所寫。 反射 最近剛讀了一遍《Java程式設計思想》第四版中第14章——型別資訊,獲益匪淺,摘

Java基礎——反射Reflection

一、什麼是反射 在執行狀態中,對於任意一個類,都能夠獲取到這個類的所有屬性和方法,對於任意一個物件,都能夠呼叫它的任意一個方法和屬性(包括私有的方法和屬性),這種動態獲取的資訊以及動態呼叫物件的方法的功能就稱為java語言的反射機制。通俗點講,通過反射,該類對我們來說是完全透明的,想

Java反射reflection特點

*.class檔案介紹 學習Java的初學者都知道Java中存在JVM來包裝java語言使得java在各種機器上都能很好的執行。一個*.java的檔案首先編譯成*.class檔案,*.class檔案是JVM能夠識別的檔案,最後*.class檔案在JVM下編譯成機器可以識別的二進位制檔案。

Android開發過程的坑及解決方法收錄

1.某個控制元件要放在Linearlayout佈局的底部(底部導航條) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.

java 反射Reflection和內省Introspector

總論:java中所有物件(object)不是引用型別(reference)就是基本型別(primitive)。不管什麼型別物件,java虛擬機器都會為之例項化一個java.lang.Class的不可變例項(Class類的例項就是執行的java應用裡的classes和inte

Java 反射Reflection

學習Spring等框架時,接觸到反射這一機制,查閱資料發現Java的反射機制對於各大主流Java框架有著舉足輕重的地位。在此特地記錄自己對於reflect相關知識的些許理解。如有錯誤之處,還請指正。 1、簡單理解什麼是反射 反射機制可以讓程式在執行時 載

perl--DBI 模組提取資料的fetch方法彙總

perl下十種fetch資料的區別以及返回資料結構: 1.fetchrow_array 提取下一行資料並將欄位儲存在陣列中返回: [codesyntax lang="perl"] #!/usr/bin/perl use DBI; use Data::Dump

Android開發過程的坑及解決方法收錄

版本號 如果 出現 過程 androi 分享圖片 onf blog end 1. 導入依賴庫出現錯誤 因為使用的sdk版本不同,使用下列代碼強制使用最低版本,25.3.1就是我當前使用的版本號,根據自己的情況修改 configurations.all {

Java部類引用部類的局部變量為何必須是final問題解析

lib soft 編譯器 art http word tail ace 軟件 今天編寫一個多線程程序,發現在方法內定義內部類時,如果內部類調用了方法中的變量,那麽該變量必須申明為final類型,百思不得其解,後來想到應該是生命周期的原因,因為方法內定義的變量是局部變量,

部類方法訪問部類變數的示例

class Day10_11 { public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); oi.print()

Java部類使用部類的成員方法以及成員變數

眾所周知,在定義成員方法或者成員變數的時候,可以給其加上一些許可權的修飾詞,以防止其他類的訪問。如在成員變數或者成員方法前面,加上Private關鍵字,則其他類就無法呼叫這個類中的成員方法或則和成員變數。但是,如果這個類有成員內部類,則不受這方面的限制。也就是說,在成員內

Java 怎麼呼叫方法

父類能呼叫子類的方法嗎? 答:能。 怎麼做? ● 把子類傳遞到父類的有參構造中,然後呼叫。● 使用反射的方式呼叫,你使用了反射還有誰不能呼叫的?! ● 父類呼叫子類的靜態方法。 案例展示: pac