什么是暴力反射

您所在的位置:网站首页 java反射的用处 什么是暴力反射

什么是暴力反射

2023-09-10 21:39| 来源: 网络整理| 查看: 265

什么是暴力反射?今天学习的一头雾水,原来之前关于反射的知识全部都还了回去… 在这里插入图片描述

好了,让我们进入正题~

首先关于反射大家都应该有了解,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

而它的用途就是在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。

所以暴力反射作为他的特性之一,我们也应该会使用它:

概括: 如果构造方法、普通方法、字段 被private(私有)修饰,默认情况下,在该类的外部是不允许被访问的,如果使用暴力反射,即使被private修饰也可以进行操作。

使用方法: 反射里的Constructor,Field,Method三个类都有一个getDeclaredXxx方法,可以不受权限控制的获取类的构造函数,字段,方法,如果想要私有构造函数创建对象,字段赋值,方法调用的话,会自动的访问类的isAccessable,默认的是false,所以,你想要访问类中的私有成员的时候,就要调用setAccessable()方法,将其改为true,这样,你就可以对类中的私有成员进行操作了.

示例:

package demo; public class A{ public String x="abc"; private String y="bbc";//私有字段 } package demo; import java.lang.reflect.Field; public class B { public static void main(String[] args) throws Exception{ A a=new A(); //对public修饰的成员字段x进行反射 Field fx=a.getClass().getField("x"); System.out.println(fx.get(a)); //对A类中私有成员字段y进行暴力反射 Field fy=a.getClass().getDeclaredField("y"); fy.setAccessible(true); System.out.println(fy.get(a)); } }

对于上面代码,定义了A和B两个类,在B类中new了A类的一个实例( A a=new A());

这时们就可以通过这个实例反射来获取a引用的对象的的共有字段x的值(x=“abc”)。

但是A类私有字段y我们却无法获取,这是我们想到了暴力反射。

原理是通过实例a的getClass()方法先获取到a所属的类的字节码,然后调用getDeclaredField(“y”)方法获取A类所有字段(包括私有);

此时虽然获取到了私有字段y,但是我们却无法查看y的值;

继续看,既然已经拿到了私有字段y,我们可以利用反射包中字段对象的setAccessible(true)方法来重新设置字段y,时期私有特性暂时失效;

继续,我们就可以利用get()方法获取到A类私有字段y的值为"bbc"。

至此,暴力反射成功。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3