首页 > 编程语言 >java反射机制原理及应用

java反射机制原理及应用

时间:2023-03-19 23:47:56浏览次数:45  
标签:反射 java 对象 Class properties 原理 method cls

java反射机制

反射机制原理示意图

java反射机制示意图

Class.forName(字节码文件) 类.class 对象.getClass()

用法:

根据配置的properties文件(不仅是properties)从而无需修改源代码的情况下调用和修改类的东西。

一. 初始化properties

Properties properties = new Properties();
        FileInputStream fileInputStream = new FileInputStream("out/production/reflect.properties");
        properties.load(fileInputStream);                                  //把文件加载到properties对象
        String classpath = properties.get("classpath").toString();         //获取key的value,然后用toString转换成string值留给Class.forName使用
        String methodName = properties.get("method").toString();

二.

	    //1.加载类,返回Class类型的对象cls				
        Class cls = Class.forName(classpath);

        //2.通过cls获取你加载的类(Hsp.Reflect)的  对象实例obj     注意要有public的无参构造方法
        Object obj = cls.newInstance();

        //3.通过cls获取加载的类的    方法对象
        Method method = cls.getMethod(methodName);

        //4.通过method方法对象,调用方法
        method.invoke(obj);     //传统方法:对象.方法        反射机制:方法对象.invoke(对象)
       
        //5.如何获取类的成员变量对象  (不可以是private)         getField();
        Field fieldName = cls.getField("name".toString());
        System.out.println(fieldName.get(obj));

        //6.获取类的构造器
	    //没填就是无参构造器
        Constructor constructor1 = cls.getConstructor();     
 		//通过有参构造器的  参数类型.class    获取有参构造器
        Constructor constructor2 = cls.getConstructor(String.class);       

通过反射获取类的结构信息

image-20230318121437998

image-20230318121441399

image-20230318121443653

image-20230318121445555

反射爆破

取消访问调用检查

method、constructor、Field都继承了Accessiable,通过method / constructor / Field.setAccessible(true)忽略访问控制检查,从而可以操作私有的成员优化性能加快速度。

标签:反射,java,对象,Class,properties,原理,method,cls
From: https://www.cnblogs.com/hanlinyuan/p/17234854.html

相关文章

  • 判断一个数字在数组中是否存在,并返回---Java
    packagepractice.people.apple;//在数组中查找一个数,看是否存在,请返回值publicclassFoundNumber{publicstaticvoidmain(String[]args){//定义数组intar......
  • Java问答
    目录什么样的标识符是合法的Java有几种基本数据类型短路与和短路或区别break和continue区别类的命名规则是什么java关键字区分大小写吗解释一下static关键字String是最基本......
  • Java项目是不是分布式,真有那么重要吗?
    大家好,我是3y啊。大概不知道从什么时候,「微服务」「分布式」这两个词又再次频繁出现在我的视线里。「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了......
  • java IO整理及读写文件常见方式
    一:流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在设备间传输称之为流。流的本质是数据传输,根据数据传输的特性将流区分为各......
  • JAVA异常处理
    Java异常简介:JAVA异常处理的目的是为保证程序在出错之后,依旧可以执行一些其它操做。该操作可以是用户的其它行为,也可以是保存程序运行后的一些结果,还可以是合理的结束程......
  • JAVA -01(简单知识介绍)
    JAVA-01前期准备介绍1972年C诞生【两大问题:指针;内存管理】1982年C++诞生【面向对象;兼容C;图形领域和游戏,但是更复杂】1995年JAVA诞生【没有指针没有内存管理;面向对象......
  • 打牢JavaScript 基础,看这篇
    原文链接:​   ​​https://note.noxussj.top/?source=51cto​​变量声明​在JavaScript程序中,使用一个变量之前应当先声明。变量是使用关键字 ​​var​​ 来声明的......
  • 你能说出SpringBoot自动装配的原理吗
    SpringBoot目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。在过去,我们要让一个Spring项......
  • 你能说说Java深拷贝和浅拷贝区别吗
    引用拷贝创建一个指向对象的引用变量的拷贝。对象拷贝创建对象本身的一个副本。注:深拷贝和浅拷贝都是对象拷贝浅拷贝被复制对象的所有变量都含有与原来的对象相同......
  • 知识图谱-TransR原理
    一.摘要知识图谱补全旨在执行实体之间的链接预测。在本文中,我们考虑了知识图嵌入的方法。最近,诸如TransE和TransH等模型通过将关系视为从头实体到尾实体的翻译来构建实体......