1. 程式人生 > >通過反射訪問任意類的私有方法和屬性

通過反射訪問任意類的私有方法和屬性

 給出一個如下類: package test2; public class MathDemo {     private int m = 10;     private MathDemo(){     }     private int add(int a,int b){     return a+b;     }     public int getM() {     return m;     } }  要求建立該類物件,呼叫add方法,改變m的值

首先我們要了解三個反射包中的類:
Constructor:代表類的單個構造方法,通過Constructor我們可以執行一個類的某個構造方法(有參或無參)來建立物件。

Method:代表類中的單個方法,可以用於執行類的某個普通方法,有參或無參,並可以接收返回值。
Field:代表類的單個屬性,用於set或get該屬性。
AccessibleObject:以上三個類的父類,提供了對構造方法、普通方法、和屬性的訪問控制的能力。

使用Class類中的方法可以獲取該類的所有Constructor物件、Method物件和Field物件,但是仍然無法訪問私有化的構造方法普通方法和私有屬性,此時我們可以使用他們繼承父類(AccessibleObject類)來的setAccessible()方法,來設定或取消訪問檢查,以達到訪問私有物件的目的。

package test2; import
 java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /**  * 調  * @author   * @date 2015-08-31 13:55:16  */ public class Demo {     public static void main(String[] argsthrows Exception {     /*      * 使      * 
MathDemo
     * private MathDemo()      */     //1.     Constructor<MathDemo> constructor = MathDemo.class.getDeclaredConstructor();     //2.     constructor.setAccessible(true);     //3.調     MathDemo mathDemo = constructor.newInstance();     /*      *  使調      *  MathDemo      *  private int add(int a,int b)      */     //1.     Method method = MathDemo.class.getDeclaredMethod("add"int.class,int.class);     //2.     method.setAccessible(true);     //3.調     int  i = (Integermethod.invoke(mathDemo1,2);     System.out.println(i);     /*      * 使      * MathDemo      * private int m = 10;      */     //1.m     Field field = MathDemo.class.getDeclaredField("m");     //2.     field.setAccessible(true);     //3.m20     field.setInt(mathDemo20);     System.out.println(mathDemo.getM());     } } 執行結果:
3 20
成功建立物件,呼叫了add方法,改變了m的值。

此處好像涉及到Java安全管理器,先練專案了,日後有空再做了解。

相關推薦

通過反射訪問任意私有方法屬性

 給出一個如下類: package test2; public class MathDemo {     private int m = 10;     private MathDemo(){     }     private int add(int a,i

C#可擴展編程之MEF學習筆記(三):導出方法屬性(轉)

學習 說了 如何 mod ati dem ont num imp 前面說完了導入和導出的幾種方法,如果大家細心的話會註意到前面我們導出的都是類,那麽方法和屬性能不能導出呢???答案是肯定的,下面就來說下MEF是如何導出方法和屬性的。   還是前面的代碼,第二篇中已經提供了下

ASP.NET -- WebForm -- HttpResponse 方法屬性

ASP.NET -- WebForm -- HttpResponse 類的方法和屬性 1. HttpResponse 類的方法 (1) AddCacheDependency: 將一組快取依賴項與響應關聯,這樣,如果響應儲存在輸出快取中並且指定的依賴項發生變化,就可以使該響應失效。 (2) AddCache

ASP.NET -- WebForm -- HttpRequest方法屬性

ASP.NET -- WebForm --  HttpRequest類的方法和屬性1. HttpRequest類的方法(1) BinaryRead: 執行對當前輸入流進行指定位元組數的二進位制讀取。 (2) Equals: 確定指定的 Object 是否等於當前的 Object。 (3) Final

java 反射(二) 反射中Class常見的方法屬性

package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 反射中Class常見的方法和屬

java中default能否修飾方法屬性

從上圖可以看到,是不能的,myEclipse 編輯器已經報錯了原因是什麼呢,不能,沒有這種寫法的,修飾符在不寫的時候有預設值,但是default不是修飾符.在switch語句裡面有default,但是也不是修飾符.

Java反射機制,通過物件訪問呼叫私有成員屬性或者方法

Java反射機制原理 Java中萬物皆物件,類class也是物件,是一個名為Class的類的物件。 所以就可以通過這個Class類型別的物件class,用物件訪問類的屬性和方法。 Class是對類的抽象(每個類對應一份位元組碼)。一般情況下,比如A a

通過反射訪問私有方法(無參)

code red tde 執行方法 奔跑吧 類類型 tom bject exc Person類: package com.fanshe.entity; public class Person { private String name; pr

[C#]通過反射訪問私有成員

eth cte ram prop nbsp turn code static tar 參考鏈接: https://www.cnblogs.com/adodo1/p/4328198.html 代碼如下: 1 using System; 2 using System.

通過反射建立私有化的物件,呼叫私有方法,改變私有屬性

首先建立一個類 public class ReflectDemo { private int m=0; //私有屬性 private ReflectDemo(){ //私有無參建構函式 } public ReflectDemo(int aa

Java通過反射呼叫一個私有方法

本文轉載自:https://www.cnblogs.com/ghq120/p/8439204.html獲得私有方法的流程是(1)獲取目標類(2)獲取目標方法  Method method=clazz.getDeclaredMethod(name);//可以呼叫類中的所有方法(

反射工具訪問方法屬性

package com.itany.util; import java.lang.reflect.*; /*  * 反射工具類  */ publicclass ReflectUtil { /* * 通過反射,獲取定義Class的父類引數的泛型的真實型別

Python的程序結構(2) -> 方法/Method -> 實例方法私有方法抽象方法

模塊 魔術 程序 技術 pytho 將不 abs 保護 error 類實例方法、私有方法和抽象方法 Python中最常用的就是類實例方法,類似於屬性中的類實例屬性,同時,也存在與私有屬性類似方法,即私有方法,下面介紹這兩種常見的方法,以及一種特殊意義的類實例方法 -- 抽

Java 自定義註解&通過反射獲取方法屬性上的註解

反射 JAVA中的反射是執行中的程式檢查自己和軟體執行環境的能力,它可以根據它發現的進行改變。通俗的講就是反射可以在執行時根據指定的類名獲得類的資訊。   註解的定義 註解通過 @interface 關鍵字進行定義。 /** * 自定義註解 *

PHP反射實現對方法依賴注入建構函式依賴注入

前段時間一直在看tp5 發現他內部實現了控制器的依賴注入。。下面 我通過程式碼來說明一下是怎麼實現的。 首先我們準備好幾個類檔案  我們先看目錄安排 其中 start.php是啟動檔案 <?php /** * Created by PhpStorm. * User: A

android 通過反射訪問內部類(也可訪問其他apk中的

//訪問某個屬性 Context mmsCtx = createPackageContext("com.android.lockscreen",  Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SE

通過反射建立物件(有引數無引數構造方法

1、建立一個實體類 package adtec.reflect; public class Person { String name; public String getName() { return name; } public void setName(String name) {

JAVA之通過反射遍歷JavaBean成員變數方法

在實際的程式碼開發中,難免會遇到資料業務邏輯複雜的表,對映到實體類之後所有的欄位都會變成對應類中的成員變數(前面有介紹外掛自動生成實體類的外掛介紹0.0) 在處理這些數量巨大的實體類的時候,取值賦值無疑變成了非常枯燥的剪下複製。下面介紹一下通過反射來獲取實體類中成員變數和方

通過反射訪問私有屬性並對其進行修改

public class Private { private String name="Lucy"; public String getName() { return name; } } import java.lang.Class; import ja

通過Java反射機制獲取物件、方法成員變數

先定義一個JavaBean package com.jim.test.Test; public class User { private int id; private String name = "abc"; private Str