了解java中暴力反射
了解暴力反射之前,先复习一下反射的基本知识。
一、什么是反射?
反射非常强大,它甚至能直接操作程序的私有属性。我们前面学习都有一个概念,被private封装的资源只能类内部访问,外部是不行的,但这个规定被反射赤裸裸的打破了。
反射就像一面镜子,它可以在运行时获取一个类的所有信息,可以获取到任何定义的信息(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
所以暴力反射也是反射的一个特性,那么就来学习如何快乐的暴力突破(狗头~)。
二、什么是暴力反射?
一般来说,被private封装的资源只能被类内部访问,外部是不可以的,那如果我们就是要从外部去访问这个资源,应该怎么办?
带着这个疑问,我们在之前的反射知识的基础上,要学习一个方法。
setAccessable(boolean flag):如果boolean值为true,则取消访问检查。就是这样一个小小的代码,让我们突破了封装的局限,看来,被称为暴力反射还是很形象的。
所以,你想要访问类中的私有成员的时候,就要调用setAccessable()
方法,将其改为true
,这样,你就可以对类中的私有成员进行操作了。
代码举例:
定义一个Student类:
public class Student {private String name;int age;public String address;public Student() {}private Student(String name) {this.name = name;}Student(String name, int age) {this.name = name;this.age = age;}public Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}private void function() {System.out.println("function");}public void method1() {System.out.println("method1");}public void method2(String s) {System.out.println("method2" + s);}public String method3(String s, int i) {return s + "," + i;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';}
}
正常反射操作去给对象赋值。
public class Test04_2 {public static void main(String[] args) throws NoSuchFieldException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class<?> c = Class.forName("test02.Student");Field address = c.getField("address");Field name = c.getDeclaredField("name");Field age = c.getDeclaredField("age");Constructor<?> con = c.getConstructor();Object obj = con.newInstance();address.set(obj,"西安");name.set(obj,"林青霞");age.set(obj,30);System.out.println(obj);}
}
结果:报错
Exception in thread "main" java.lang.IllegalAccessException: Class test04.Test04_2 can not access a member of class test02.Student with modifiers "private"at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)at java.lang.reflect.Field.set(Field.java:761)at test04.Test04_2.main(Test04_2.java:21)
调用setAccessable()
方法后:
public class Test04_2 {public static void main(String[] args) throws NoSuchFieldException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class<?> c = Class.forName("test02.Student");Field address = c.getField("address");Field name = c.getDeclaredField("name");name.setAccessible(true);Field age = c.getDeclaredField("age");age.setAccessible(true);Constructor<?> con = c.getConstructor();Object obj = con.newInstance();address.set(obj, "西安");name.set(obj, "林青霞");age.set(obj, 30);System.out.println(obj);}
}
结果:
Student{name='林青霞', age=30, address='西安'}
了解java中暴力反射相关推荐
- java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析
什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...
- Java中的反射如何理解——精简
目录 引言 反射概念 反射获取类对象 反射获取构造器对象 获取构造器对象并使用 反射获取成员变量对象 反射获取方法对象 反射获取成员方法并使用 引言 经过前面的学习,相信大家已经能够对网络编程有了一定 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- Java 中使用反射来创建对象、调用方法
Java 中使用反射来创建对象.调用方法 反射创建对象 反射调用方法 反射调用私有方法 反射调用可变参私有方法 反射调用的方法自身可以抛出异常的情形 假设已有下面的类: import java.l ...
- 深入理解Java中的反射技术
Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法:并且对于任意一个对象,都能够调用它的任意一个方法:这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射 ...
- formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化
今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...
- java中的反射机制是什么
给大家介绍一下java中的反射机制,java中反射机制更体现出了java的灵活性.多态.和类之间的耦合性. 1:反射是一种间接操作目标对象的机制,只要给定类的名字,就可以通过反设机制获取所有的类信息. ...
- Java中的反射和枚举
假设现在上面的数据是以二次探测的方式来进行存放的,现在让你求: 现在找1:直接就能找到----->次数是1 现在找4:直接就可以找到---->次数是1 现在找14:先得到4的下标,发现不是 ...
- Java中的反射机制详讲
Java中的反射机制详讲 1.反射机制_介绍_Class对象获取 2.反射机制_动态操作_构造器_方法_属性 3.动态编译_DanamicCompile_反射调用main方法问题 好文推荐:排序.查找 ...
- 什么是java中的反射?反射的一些常用方法
一.什么是java中的反射 Java 反射,就是在运行状态中. 获取任意类的名称.package信息.所有属性.方法.注解.类型.类加载器等 获取任意对象的属性,并且能改变对象的属性 调用任意对象的方 ...
最新文章
- UVA1587-Box
- Turn off UAC, Windows Firewall, Set time zone
- 【转载】增强中调用BAPI并COMMIT使用
- 网易来聊聊子弹短信的消息漫游技术
- eclipse+android source code
- 图解算法之排序算法(2)——选择排序
- python双层for循环优化,如何优化Python中的嵌套for循环
- 金立手机用60亿“砸死”了自己
- 【转贴CSDN】关于DataGrid的精华
- [POJ 1006] 生理周期
- ZEMAX | HUD 设计实例
- 新股发行制度五年改革历程
- 短信中心号码iphone_如何在iPhone上阻止来自特定号码的呼叫
- 仿小米官网首页 动态交互(HTML+css+jq)1.通栏以及logo部分
- 双摄像头另一个有什么用_手机双摄像头为什么有前后和后双两种?各有什么用?...
- 2021年HSP律所代理品牌侵权案件合集,赶紧查看避免踩坑
- SAP 采购订单入库——移动类型
- python h5py 创建无限数据集、在无限数据集上添加新的数据
- 用Python写个桌面挂件,手把手带你做只桌面宠物~
- 幸福,是一种有节制的满足,冷暖自知。
热门文章
- MySQL基本架构示意图
- 如何爬取豆瓣电影?python十分钟搞定
- 1468. 计算税后工资
- 小武与剑指offer的恩怨情仇
- java脚本引擎parseint方法_autojs脚本引擎调用java的jsoup爬取科学网博客的指定id的好友名字...
- matlab生成的数值为inf,计算值时为Nan / inf
- Oracle怎么清除视图数据,oracle如何删除视图?
- 3个步骤+1个模型,「数据分析」才是「增长黑客」的核心技能
- 艺术与实在中的递归 递归和原始递归函数——读哥德尔之六
- **time_limited.sof文件