Java如何通過反射獲取私有構(gòu)造、私有對象、私有字段、私有方法
更新時間:2021年12月14日 11:27:10 作者:弦上的夢
這篇文章主要介紹了Java如何通過反射獲取私有構(gòu)造、私有對象、私有字段、私有方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
Java反射獲取私有構(gòu)造、私有對象、私有字段、私有方法
1. 創(chuàng)建測試的私有對象
/**
* @author lirong
* @desc 測試對象
* @date 2019/06/20 20:07
*/
public class Person {
private int age = 5;
private String name;
private Person(){}
private String test(String name){
System.out.println("name: "+name);
return "test";
}
}
2. 獲取私有對象中的屬性和方法
/**
* @author lirong
* @desc 反射獲取私有屬性和方法
* @date 2019/06/20 20:10
*/
public class Test {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
// 1. 獲取class對象
Class clazz = Person.class;
// 2. 獲取私有無參構(gòu)造
Constructor c = clazz.getDeclaredConstructor();
// 3. 設(shè)置訪問為可見
c.setAccessible(true);
// 4. 通過構(gòu)造器創(chuàng)建實例對象
Person person = (Person) c.newInstance();
// 根據(jù)字段名稱獲取class中的字段
Field age = clazz.getDeclaredField("age");
age.setAccessible(true);
System.out.println(age.getName() + " = " + age.get(person));
// 修改私有變量的默認值
age.set(person, 18);
System.out.println(age.getName() + " = " + age.get(person));
// 5. 獲取所有字段
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
// 設(shè)置字段的可見性
f.setAccessible(true);
String name = f.getName();
Object o = f.get(person);
System.out.println(name + " - " + o);
}
// 6. 獲取所有的方法
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) {
m.setAccessible(true);
String name = m.getName();
Object invoke = m.invoke(person, "張三");
System.out.println(name + " = "+invoke);
}
}
}
通過反射獲取私有內(nèi)部類對象
首先是我們的目標對象:
class Out {
//目標獲取Inner對象
private class Inner {
//內(nèi)部類的私有成員屬性
private String inner = "ccc";
}
}
直接列出代碼
public class Main {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) throws Exception {
//獲取外部類
Class clzz = Out.class;
//獲取外部類默認無參構(gòu)造方法
Constructor con = clzz.getDeclaredConstructor();
//實例一個外部類對象
Out outObj = (Out) con.newInstance();
//獲取外部類內(nèi)的所有內(nèi)部類
Class innerClazz[] = clzz.getDeclaredClasses();
//遍歷
for (Class c : innerClazz) {
//獲取修飾符的整數(shù)編碼
int mod = c.getModifiers();
//返回整數(shù)編碼對應(yīng)的修飾符的字符串對象
String modifier = Modifier.toString(mod);
//找到被private修飾的內(nèi)部類
if (modifier.contains("private")) {
//根據(jù)內(nèi)部類的特性,需要由外部類來反射獲取內(nèi)部類的構(gòu)造方法(這里獲取的是內(nèi)部類的默認構(gòu)造方法)
Constructor cc = c.getDeclaredConstructor(clzz);
//由于內(nèi)部類是私有的,需要強制獲取構(gòu)造方法的訪問權(quán)限
cc.setAccessible(true);
//由外部類對象來反射獲取內(nèi)部類的對象
Object obj=cc.newInstance(outObj);
//獲取內(nèi)部類的私有成員屬性inner
Field f=c.getDeclaredField("inner");
//獲取訪問權(quán)限
f.setAccessible(true);
//獲取內(nèi)部類對象obj中的私有成員屬性inner的值
System.out.println(f.get(obj));
}
}
}
}
輸出結(jié)果:
ccc
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟異常
這篇文章主要為大家介紹了Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟的異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步2022-02-02
java接口返回參數(shù)按照請求參數(shù)進行排序方式
這篇文章主要介紹了java接口返回參數(shù)按照請求參數(shù)進行排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java基于SpringBoot和tk.mybatis實現(xiàn)事務(wù)讀寫分離代碼實例
這篇文章主要介紹了Java基于SpringBoot和tk.mybatis實現(xiàn)事務(wù)讀寫分離代碼實例,讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作,而從數(shù)據(jù)庫處理SELECT查詢操作,數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫,需要的朋友可以參考下2023-10-10
java兩個數(shù)組合并為一個數(shù)組的幾種方法
這篇文章主要給大家介紹了關(guān)于java兩個數(shù)組合并為一個數(shù)組的幾種方法,最近在寫代碼時遇到了需要合并兩個數(shù)組的需求,文中將每種方法都介紹的非常詳細,需要的朋友可以參考下2023-07-07
Struts1教程之ActionMapping_動力節(jié)點Java學院整理
這篇文章主要介紹了Struts1教程之ActionMapping,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09

