了解暴力反射之前,先复习一下反射的基本知识。

一、什么是反射?

反射非常强大,它甚至能直接操作程序的私有属性。我们前面学习都有一个概念,被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中暴力反射相关推荐

  1. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析

    什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...

  2. Java中的反射如何理解——精简

    目录 引言 反射概念 反射获取类对象 反射获取构造器对象 获取构造器对象并使用 反射获取成员变量对象 反射获取方法对象 反射获取成员方法并使用 引言 经过前面的学习,相信大家已经能够对网络编程有了一定 ...

  3. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  4. Java 中使用反射来创建对象、调用方法

    Java 中使用反射来创建对象.调用方法 反射创建对象 反射调用方法 反射调用私有方法 反射调用可变参私有方法 反射调用的方法自身可以抛出异常的情形   假设已有下面的类: import java.l ...

  5. 深入理解Java中的反射技术

    Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法:并且对于任意一个对象,都能够调用它的任意一个方法:这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射 ...

  6. formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化

    今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...

  7. java中的反射机制是什么

    给大家介绍一下java中的反射机制,java中反射机制更体现出了java的灵活性.多态.和类之间的耦合性. 1:反射是一种间接操作目标对象的机制,只要给定类的名字,就可以通过反设机制获取所有的类信息. ...

  8. Java中的反射和枚举

    假设现在上面的数据是以二次探测的方式来进行存放的,现在让你求: 现在找1:直接就能找到----->次数是1 现在找4:直接就可以找到---->次数是1 现在找14:先得到4的下标,发现不是 ...

  9. Java中的反射机制详讲

    Java中的反射机制详讲 1.反射机制_介绍_Class对象获取 2.反射机制_动态操作_构造器_方法_属性 3.动态编译_DanamicCompile_反射调用main方法问题 好文推荐:排序.查找 ...

  10. 什么是java中的反射?反射的一些常用方法

    一.什么是java中的反射 Java 反射,就是在运行状态中. 获取任意类的名称.package信息.所有属性.方法.注解.类型.类加载器等 获取任意对象的属性,并且能改变对象的属性 调用任意对象的方 ...

最新文章

  1. UVA1587-Box
  2. Turn off UAC, Windows Firewall, Set time zone
  3. 【转载】增强中调用BAPI并COMMIT使用
  4. 网易来聊聊子弹短信的消息漫游技术
  5. eclipse+android source code
  6. 图解算法之排序算法(2)——选择排序
  7. python双层for循环优化,如何优化Python中的嵌套for循环
  8. 金立手机用60亿“砸死”了自己
  9. 【转贴CSDN】关于DataGrid的精华
  10. [POJ 1006] 生理周期
  11. ZEMAX | HUD 设计实例
  12. 新股发行制度五年改革历程
  13. 短信中心号码iphone_如何在iPhone上阻止来自特定号码的呼叫
  14. 仿小米官网首页 动态交互(HTML+css+jq)1.通栏以及logo部分
  15. 双摄像头另一个有什么用_手机双摄像头为什么有前后和后双两种?各有什么用?...
  16. 2021年HSP律所代理品牌侵权案件合集,赶紧查看避免踩坑
  17. SAP 采购订单入库——移动类型
  18. python h5py 创建无限数据集、在无限数据集上添加新的数据
  19. 用Python写个桌面挂件,手把手带你做只桌面宠物~
  20. 幸福,是一种有节制的满足,冷暖自知。

热门文章

  1. MySQL基本架构示意图
  2. 如何爬取豆瓣电影?python十分钟搞定
  3. 1468. 计算税后工资
  4. 小武与剑指offer的恩怨情仇
  5. java脚本引擎parseint方法_autojs脚本引擎调用java的jsoup爬取科学网博客的指定id的好友名字...
  6. matlab生成的数值为inf,计算值时为Nan / inf
  7. Oracle怎么清除视图数据,oracle如何删除视图?
  8. 3个步骤+1个模型,「数据分析」才是「增长黑客」的核心技能
  9. 艺术与实在中的递归 递归和原始递归函数——读哥德尔之六
  10. **time_limited.sof文件