反射呼叫類的私有方法與私有內部類的私有方法

2022-09-10 07:09:11 字數 2482 閱讀 6933

package org.example;

import j**ax.lang.model.element.variableelement;

public class dt

}class students

private string get2(string b)

private class dt

}}

在student公共類中定義乙個私有的的類dt,裡面有私有的方法get3,還有兩個私有的方法get1 和 get2

由於jvm為每個載入的class建立了對應的class(大寫)例項,並在例項中儲存了該class的所有資訊,包括類名、包名、父類、實現的介面、所有方法、欄位等,因此,如果獲取了某個class例項,我們就可以通過這個class例項獲取到該例項對應的class的所有資訊。

所以第一步先要獲取到類的例項class

class a = class.forname("org.example.students");
第二步通過反射建立例項(可以通過呼叫class提供的newinstance()方法)

object b =a.newinstance();
第三步通過反射獲取students類的私有方法get1

method c = a.getdeclaredmethod("get1",int.class);
第四步,設定允許私有類的方法可以被訪問

c.setaccessible(true);
第五步輸出

system.out.println(c.invoke(b,11));
invoke(反射類的例項,隨意方法的資料型別值)

第一步、獲取內部類dt例項class

class d =class.forname("org.example.students$dt");
第二步、建立私有類的例項需要先獲得類的構造方法

constructor e = d.getdeclaredconstructors()[0];
第三步、設定允許私有類的的私有類dt可以被訪問

e.setaccessible(true);
第四步、通過構造方法去建立例項,注意:建立內部類的例項的前提得先建立乙個外部類的例項,這裡注意建立外部類的例項是students,上面第一步的a(class a = class.forname("org.example.students"))

object f = e.newinstance(a.newinstance());
第五步、通過例項反射內部的私有方法

method g = f.getclass().getdeclaredmethod("get3",int.class);
第六步、設定允許私有類的方法get3可以被訪問

g.setaccessible(true);
第七步、輸出

system.out.println(g.invoke(f,11));
getconstructor(class...):獲取某個public的constructor;

getdeclaredconstructor(class...):獲取某個constructor;

getconstructors():獲取所有public的constructor;

getdeclaredconstructors():獲取所有constructor。

method getmethod(name, class...):獲取某個public的method(包括父類)

method getdeclaredmethod(name, class...):獲取當前類的某個method(不包括父類);name為方法名

method getmethods():獲取所有public的method(包括父類)

method getdeclaredmethods():獲取當前類的所有method(不包括父類)

package org.example;

import j**ax.lang.model.element.variableelement;

import j**a.lang.reflect.constructor;

import j**a.lang.reflect.method;

public class dt

}class students

private string get2(string b)

private class dt

}}

外部方法呼叫內部 私有屬性和私有方法

應用場景 定義方式 不要問女生的年齡 self.age 18 def secret self print 我的年齡是 d self.age xiaofang women 小芳 私有屬性,外部不能直接訪問 print xiaofang.age 私有方法,外部不能直接呼叫 xiaofang.secret...

利用反射機制呼叫私有方法

步驟1 獲取到當前執行緒的類載入器 classloader classloader thread.currentthread getcontextclassloader 步驟2 用類載入器獲取的class物件 class clazz classloader.loadclass com.wxw.tes...

類的私有屬性和私有方法

class role def init self,name,role,weapon,value 100,money 1500 建構函式 self.name name 例項變數 靜態屬性 作用域就是實力本身 self.role role self.weapon weapon self.value va...