通过反射机制去访问类的属性,方法,构造器时,可以通过Class 的类的方法直接访问到对象的公有属性和私有属性,类属性等。当然这肯定违背了对象封装的意义,所以当通过反射机制去直接访问非公有属性,方法,和构造器时,均不能正常运行,如果想要正常执行代码,需要通过反射机制的“暴破”方法,强制进行访问。
具体的方法就是通过 setAccessible 方法直接设置为true就可以实现暴破。

  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");//无参构造器创建实例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;}@Overridepublic 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);//访问静态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;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
  1. 通过反射访问类的方法
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);//静态ffMethod 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方法");}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

Java--反射的“暴破”机制 (SetAccessible方法)相关推荐

  1. 利用java反射调用类的的私有方法

    http://blog.csdn.net/sunyujia/article/details/2501709 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根 ...

  2. 利用java反射调用类的的私有方法--转

    原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...

  3. java反射 修改静态方法的值 setAccessible

    转载自 java反射 修改静态方法的值 setAccessible 这几天闲来无事.在网上看了一个题目,相信大家都知道这个题目 static void change(String str){str=& ...

  4. java反射实现自定义json转对象方法-忽略字段大小写、字段个数

    java反射实现自定义json转对象方法-忽略字段大小写.字段个数 开发过程中经常会遇到json转对象,可以使用FastJson或者Gson自带的工具类进行转换,但当遇到json与对象属性名称大小写不 ...

  5. java 反射 getclass_Java反射中的getClass()方法

    Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代 ...

  6. java反射(reflect)机制模拟javabean的实现

    2019独角兽企业重金招聘Python工程师标准>>> 解释主要在代码里,在这里就不多废话了,直接上代码: package onlyfun.caterpillar;public cl ...

  7. 【韩顺平】Java反射机制笔记

    文章目录 1.前言 2.一个需求引出反射 3.反射机制 3.1 Java Reflection 3.2 反射机制原理图 3.3 反射机制可以完成的功能 3.4 反射相关的主要类 3.5 反射优点和缺点 ...

  8. 反射setAccessible()方法

    反射setAccessible()方法 使用反射机制setAccessible方法设置字段是否可以访问,使用反射机制可以打破封装性,导致了java对象的属性不安全. setAccessible()方法 ...

  9. Java 编程问题:七、Java 反射类、接口、构造器、方法和字段

    原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],自豪地采用谷歌翻译. 本章包括涉及 Java 反射 ...

  10. (转载)Java反射机制

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

最新文章

  1. bzoj 4813: [Cqoi2017]小Q的棋盘【树形dp】
  2. 1.12 实例:猜数字小游戏
  3. iwrite提交不了作业_在云端,我们把花样作业pick起来!
  4. POI实现读写内容到word中
  5. 「最简单」的 Core Data 上手指南
  6. 消息中间件 --- Kafka快速入门
  7. 解决SecureCRT与SecureFX中文乱码问题
  8. .Net快速获取网络文本文件最后一段文字-小应用
  9. 33款创意的二维码名片设计作品欣赏
  10. R语言快速绘制多因素回归分析森林图(1)
  11. 如何用UE4制作2D游戏文档(四)——NPC篇
  12. 维刻柠檬鲜果冰怎么样?
  13. 电商项目分析用户购买行为案例一
  14. ps html 优化,photoshop越用越卡的解决方法,ps性能优化教程
  15. Java实战项目-移动电商秒杀系统seckill优化
  16. 数据压缩作业——浊音,清音,爆破音时频分析
  17. EXECUTE IMMEDIATE用法小结
  18. 基于HMM的拼音转汉字程序
  19. Plant Com:定量检测宿主微生物组的HA-QAP技术
  20. 设计师:设计师知识储备(设计分类、设计十种形式、设计要素、设计原则、室内设计风格流行趋势)之详细攻略

热门文章

  1. 这2种程序员的惊人差距,实在不忍直视...
  2. 关于Aruco标记的理解并对其进行姿态估计的可视化显示
  3. 输入一些整数,编程计算并输出其中所有正数的和,输入负数或零时表示输入数据结束。输出正数的和以及正数的项目。
  4. RocketMQ消息消费三:负载均衡
  5. Service Cloud Console - Suggested Article侧边栏组件在Classic创建的Case中无法显示
  6. Vue日历组件将标准时间(阳历,公历)变成农历、阴历
  7. 科技业巨头GMO将协助客户开采Zcash,同时收取利润分成
  8. error: L6050U: The code size of this image exceeds the maximum allowed for this version
  9. 易语言简单字符串加解密
  10. 死锁引起的思考:事务(进程 ID 51)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。