Java中反射的"暴破"機制(SetAccessible方法)詳解
更新時間:2022年08月16日 09:19:51 作者:Gao_小豆
這篇文章主要為大家詳細介紹了Java中反射的"暴破"機制,以及如何利用這一機制實現(xiàn)訪問非公有屬性,方法,和構造器,文中示例代碼講解詳細,感興趣的可以了解一下
通過反射機制去訪問類的屬性,方法,構造器時,可以通過Class 的類的方法直接訪問到對象的公有屬性和私有屬性,類屬性等。當然這肯定違背了對象封裝的意義,所以當通過反射機制去直接訪問非公有屬性,方法,和構造器時,均不能正常運行,如果想要正常執(zhí)行代碼,需要通過反射機制的“暴破”方法,強制進行訪問。
具體的方法就是通過 setAccessible 方法直接設置為true就可以實現(xiàn)暴破。
1.通過反射訪問構造器
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");
//無參構造器創(chuàng)建實例
Object o2 = cls.newInstance();
System.out.println(o2);
//訪問公有帶參構造器
Constructor constructor = cls.getConstructor(String.class);
Object o = constructor.newInstance("AAA");
System.out.println(o);
//訪問私有的有參構造器
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;
//無參構造
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. 訪問無參 必須帶無參構造器
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);
//調用的時候一定帶上屬性
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 +
'}';
}
}
到此這篇關于Java中反射的"暴破"機制(SetAccessible方法)詳解的文章就介紹到這了,更多相關Java反射暴破機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java整合mybatis實現(xiàn)過濾數(shù)據
這篇文章主要介紹了Java整合mybatis實現(xiàn)過濾數(shù)據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01

