您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java怎么通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
/** * @author lirong * @desc 測(cè)試對(duì)象 * @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"; } }
/** * @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對(duì)象 Class clazz = Person.class; // 2. 獲取私有無(wú)參構(gòu)造 Constructor c = clazz.getDeclaredConstructor(); // 3. 設(shè)置訪問(wèn)為可見(jiàn) c.setAccessible(true); // 4. 通過(guò)構(gòu)造器創(chuàng)建實(shí)例對(duì)象 Person person = (Person) c.newInstance(); // 根據(jù)字段名稱獲取class中的字段 Field age = clazz.getDeclaredField("age"); age.setAccessible(true); System.out.println(age.getName() + " = " + age.get(person)); // 修改私有變量的默認(rèn)值 age.set(person, 18); System.out.println(age.getName() + " = " + age.get(person)); // 5. 獲取所有字段 Field[] fields = clazz.getDeclaredFields(); for (Field f : fields) { // 設(shè)置字段的可見(jiàn)性 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); } } }
首先是我們的目標(biāo)對(duì)象:
class Out { //目標(biāo)獲取Inner對(duì)象 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; //獲取外部類默認(rèn)無(wú)參構(gòu)造方法 Constructor con = clzz.getDeclaredConstructor(); //實(shí)例一個(gè)外部類對(duì)象 Out outObj = (Out) con.newInstance(); //獲取外部類內(nèi)的所有內(nèi)部類 Class innerClazz[] = clzz.getDeclaredClasses(); //遍歷 for (Class c : innerClazz) { //獲取修飾符的整數(shù)編碼 int mod = c.getModifiers(); //返回整數(shù)編碼對(duì)應(yīng)的修飾符的字符串對(duì)象 String modifier = Modifier.toString(mod); //找到被private修飾的內(nèi)部類 if (modifier.contains("private")) { //根據(jù)內(nèi)部類的特性,需要由外部類來(lái)反射獲取內(nèi)部類的構(gòu)造方法(這里獲取的是內(nèi)部類的默認(rèn)構(gòu)造方法) Constructor cc = c.getDeclaredConstructor(clzz); //由于內(nèi)部類是私有的,需要強(qiáng)制獲取構(gòu)造方法的訪問(wèn)權(quán)限 cc.setAccessible(true); //由外部類對(duì)象來(lái)反射獲取內(nèi)部類的對(duì)象 Object obj=cc.newInstance(outObj); //獲取內(nèi)部類的私有成員屬性inner Field f=c.getDeclaredField("inner"); //獲取訪問(wèn)權(quán)限 f.setAccessible(true); //獲取內(nèi)部類對(duì)象obj中的私有成員屬性inner的值 System.out.println(f.get(obj)); } } } }
輸出結(jié)果:
ccc
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Java怎么通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。