Java中反射的"暴破"機(jī)制(SetAccessible方法)詳解
通過反射機(jī)制去訪問類的屬性,方法,構(gòu)造器時(shí),可以通過Class 的類的方法直接訪問到對(duì)象的公有屬性和私有屬性,類屬性等。當(dāng)然這肯定違背了對(duì)象封裝的意義,所以當(dāng)通過反射機(jī)制去直接訪問非公有屬性,方法,和構(gòu)造器時(shí),均不能正常運(yùn)行,如果想要正常執(zhí)行代碼,需要通過反射機(jī)制的“暴破”方法,強(qiáng)制進(jìn)行訪問。
具體的方法就是通過 setAccessible 方法直接設(shè)置為true就可以實(shí)現(xiàn)暴破。
1.通過反射訪問構(gòu)造器
package com.java.SetAcc; import java.lang.reflect.Constructor; public class ReflectCon { public static void main(String[] args) throws Exception { Class cls = Class.forName("com.java.SetAcc.Student"); //無參構(gòu)造器創(chuàng)建實(shí)例 Object o2 = cls.newInstance(); System.out.println(o2); //訪問公有帶參構(gòu)造器 Constructor constructor = cls.getConstructor(String.class); Object o = constructor.newInstance("AAA"); System.out.println(o); //訪問私有的有參構(gòu)造器 Constructor constructor1 = cls.getDeclaredConstructor(String.class,int.class); //暴破!!?。? constructor1.setAccessible(true); Object o1 = constructor1.newInstance("bbb",12); System.out.println(o1); } } class Student{ public String name = "aaa"; public int age = 10; //無參構(gòu)造 public Student() { } public Student(String name){ this.name = name; } private Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
2.通過反射訪問類的屬性
package com.java.SetAcc; import java.lang.reflect.Field; public class ReflectField_ { public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("com.java.SetAcc.User"); //1. 訪問無參 必須帶無參構(gòu)造器 Object o = cls.newInstance(); //訪問public的屬性 Field name = cls.getField("name"); //可以通過set修改值 name.set(o,"bbb"); System.out.println(name.get(o)); //2.訪問私有屬性 Field age = cls.getDeclaredField("age"); //暴破?。?! 直接訪問 age.setAccessible(true); age.set(o,12); System.out.println(o); //訪問靜態(tài) Field salary = cls.getField("salary"); //可以通過null修改屬性值 salary.set(null,2000); System.out.println(salary.get(null)); } } class User{ public String name = "aaa"; private int age = 10; public static double salary = 10000; public User() { } public User(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
3.通過反射訪問類的方法
package com.java.SetAcc; import java.lang.reflect.Method; public class ReflectMethod_ { public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("com.java.SetAcc.Person"); Object o = cls.newInstance(); //公有方法 Method hi = cls.getMethod("hi", String.class); //調(diào)用的時(shí)候一定帶上屬性 hi.invoke(o,"aaa"); //私有方法 Method hello = cls.getDeclaredMethod("hello", int.class); hello.setAccessible(true); hello.invoke(o,10); //靜態(tài)ff Method bye = cls.getDeclaredMethod("bye"); bye.setAccessible(true); bye.invoke(null); } } class Person{ public String name; public int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public void hi(String name){ System.out.println("hi方法"+name); } private void hello(int age){ System.out.println("hello方法"+age); } static void bye(){ System.out.println("bye方法"); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
到此這篇關(guān)于Java中反射的"暴破"機(jī)制(SetAccessible方法)詳解的文章就介紹到這了,更多相關(guān)Java反射暴破機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 關(guān)于遞歸的調(diào)用機(jī)制精細(xì)解讀
關(guān)于遞歸是什么,簡(jiǎn)單的說: 遞歸就是方法自己調(diào)用自己,每次調(diào)用時(shí) 傳入不同的變量.遞歸有助于編程者解決復(fù)雜的問題,同時(shí)可以讓代碼變得簡(jiǎn)潔2021-10-10Apache Calcite進(jìn)行SQL解析(java代碼實(shí)例)
Calcite是一款開源SQL解析工具, 可以將各種SQL語句解析成抽象語法樹AST(Abstract Syntax Tree), 之后通過操作AST就可以把SQL中所要表達(dá)的算法與關(guān)系體現(xiàn)在具體代碼之中,今天通過代碼實(shí)例給大家介紹Apache Calcite進(jìn)行SQL解析問題,感興趣的朋友一起看看吧2022-01-01一篇文章帶你了解Java Spring基礎(chǔ)與IOC
這篇文章主要介紹了Java Spring基礎(chǔ)與IOC,文中講解的相關(guān)內(nèi)容非常詳細(xì),也運(yùn)用了大量的代碼進(jìn)行講解,感興趣的小伙伴可以參考一下2021-08-08Java異常(Exception)處理以及常見異??偨Y(jié)
在《Java編程思想》中這樣定義異常,阻止當(dāng)前方法或作用域繼續(xù)執(zhí)行的問題,雖然java中有異常處理機(jī)制,但是要明確一點(diǎn),決不應(yīng)該用"正常"的態(tài)度來看待異常,這篇文章主要給大家介紹了關(guān)于Java異常(Exception)處理以及常見異常的相關(guān)資料,需要的朋友可以參考下2021-10-10使用AOP+反射實(shí)現(xiàn)自定義Mybatis多表關(guān)聯(lián)查詢
這篇文章主要介紹了使用AOP+反射實(shí)現(xiàn)自定義Mybatis多表關(guān)聯(lián),目前的需求是增強(qiáng)現(xiàn)有的查詢,使用簡(jiǎn)單的注解即可實(shí)現(xiàn)多表關(guān)聯(lián),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05