Java之反射机制

尽量一篇写全


文章目录

  • Java之反射机制
  • 1. 反射
    • 作用
    • 优点
  • 2、原理
    • Java代码在计算机中经历的三个阶段
  • 3.使用步骤
    • 相关包
      • 重要类
    • 获取class的对象的方式
      • 结论
    • class对象功能
      • 1.获取成员变量们
        • 注意:
      • 2.获取构造方法们
      • 3.获取成员方法们
  • 4.框架类
      • 运行结果
    • 结论

1. 反射

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

一句话概括:将类的各个组成部分装为其他对象,然后使用。

作用

通过Java语言中的反射机制可以操作字节码文件。
读和修改 .class文件

优点

可以在程序运行过程中操作其对象
可以解耦,提高程序的可扩展性

2、原理

Java代码在计算机中经历的三个阶段

如下(示例):


我们这里反射讲的就是Class类对象阶段的处理。


3.使用步骤

相关包

java.lang.reflect*

重要类

java.lang.Class   代表字节码,代表一个类型
java.lang.reflect.Field   代表字节码中属性字节码  成员变量
java.lang.reflect.Constructor   代表字节码中的构造方法字节码 构造方法
java.lang.reflect.Method   代表字节码中的方法字节码  成员方法

获取class的对象的方式

前提:创建了一个Person对象
1.Class.forName(“全类名”):将字节码文件加载进内存,返回class对象。
区别:在源代码阶段 ,类还没有加载进内存
使用场景:多用于配置文件 读取文件,加载类

        //forName()  静态方法Class c1 = Class.forName("Demo.day10.Person");System.out.println(c1);

2.类名.class:通过类名的属性class获取。
区别:已经在内存。
使用场景:多用于参数传递

        //类名.classClass c2 = Person.class;System.out.println(c2);

3.对象.getClass():运行阶段分装在object类当中,意味着所有对象都可以调用此方法

区别:运行阶段
使用场景:多用于对象获取字节码方式

结论

三种方式使用equals返回的都是true,也就是说
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次

class对象功能

前提:Class personClass = Person.class

1.获取成员变量们

Field[] getFields()   获取public成员变量
//Field[ ] getFields()   获取public成员变量Field[] fields = personClass.getFields();for (Field field : fields) {System.out.println(field);}
Field  getField(String name) 获取指定名称的的public成员变量
Field:成员变量
操作:1.设置值  set()2.获取值   get()
         //获取a 成员变量的值//必须将对象传进去Field a = personClass.getField("a");Person p = new Person();Object value = a.get(p);System.out.println(value);//设置a的值a.set(p,"张三");System.out.println(p);
Field[ ] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
        //Field[ ] getDeclaredFields() 获取所有的成员变量Field[] declaredFields = personClass.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}
Field  getDeclaredField(String name) 获取指定的成员变量,不考虑修饰符
        //d为私有的Field d = personClass.getDeclaredField("d");//忽略访问修饰权限的安全检查d.setAccessible(true);//暴力反射Object value2 = d.get(p);System.out.println(value2);

注意:

setAccessible( )
设置或者取消这个可访问对象的可访问标志,如果拒绝访问则抛出IllegalAccessException异常
非法访问异常

setAccessible(true)
也就是忽略访问修饰权限的安全检查

2.获取构造方法们

创建对象:newInstance()Constructor<?>[ ] getConstructors()
Constructor<T> getConstructor(类<?>... parameterTypes)  Constructor<?>[] getDeclaredConstructors()
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
//创建对象  有参
Constructor constructor = personClass.getConstructor(String.class, int.class);System.out.println(constructor);Object obj = constructor.newInstance("张三", 23);System.out.println(obj);
//创建对象 无参
Constructor constructor1 = personClass.getConstructor();Object obj2 = constructor1.newInstance();System.out.println(obj2);
       //简化方法--针对空参构造Object obj3 = personClass.newInstance();System.out.println(obj3);

3.获取成员方法们

执行方法 invok (对象,参数列表)
Method[] getMethods()
        //获取所有public方法Method[] methods = personClass.getMethods();//不仅有Person里面的方法,还有object里面的方法for (Method method : methods) {System.out.println(method);String name = method.getName();System.out.println(name);}
Method getMethod(String name, 类<?>... parameterTypes) Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 类<?>... parameterTypes)
        //获取方法Method eat = personClass.getMethod("eat");Person person = new Person();//执行方法---不需要传参eat.invoke(p);
        //带参数方法Method eat1 = personClass.getMethod("eat", String.class);//执行方法eat1.invoke(p,"粑粑");

4.框架类

了解了反射机制后,我们可以来搭建一个框架类

需求:  写一个框架,在不改变代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
实现:1.配置文件2.反射
步骤 :
1.将需要创建的对象全名和执行方法定义在配置文件中
2.在程序中加载读取配置文件
3.使用反射技术来加载文件进内存
4.创建对象
5.执行方法

如下(示例):

Person类

public class Person {private String name;private  int age;public String a;protected String b;String c;private String d;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", a='" + a + '\'' +", b='" + b + '\'' +", c='" + c + '\'' +", d='" + d + '\'' +'}';}public void eat(){System.out.println("吃····");}public void eat(String food){System.out.println("吃····"+food);}
}

配置文件
我创建的是manven工程,使用getResourcesAsStream的时候自动去解析Resources目录下的配置文件。只要放在resources目录下,就可以读出来。

public class ReflectDemo3 {public static void main(String[] args) throws Exception {//创建Properties对象Properties pro =new Properties();//加载配置文件,转换为一个集合//获取文件路径,可以实用类加载器ClassLoader classLoader = ReflectDemo3.class.getClassLoader();InputStream is = classLoader.getResourceAsStream("pro.properties");pro.load(is);//获取配置文件中定义的数据String className = pro.getProperty("className");String methodName = pro.getProperty("methodName");//加载该类进内存(反射)//返回class对象Class c = Class.forName(className);//创建对象Object obj = c.newInstance();//获取方法对象Method method = c.getMethod(methodName);//执行方法method.invoke(obj);}
}
运行结果
吃····

结论

搭建完这样一个框架类,我们就不用传统方式去创建对象,只需要修改配置文件即可。当遇到大型工程时,这种方法的优点级为突出。
符合ocp开闭原则:对扩展开发,修改关闭。

Java---反射机制相关推荐

  1. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  2. Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

    Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn   发布于:2012-09-15 ...

  3. Java反射机制分析指南

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  4. 反射 字段_详解面试中常考的 Java 反射机制

    反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...

  5. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】...

    方法1:通过get()方法获取属性值 package com.sxd.test.controller;public class FirstCa{private Integer num;private ...

  6. java基础-java反射机制

    2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...

  7. 利用java反射机制进行对象操作

    我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...

  8. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

    关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...

  9. java继承 映射_hibernate继承关系映射和java反射机制的运用

    转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...

  10. java初反射_初始 java 反射机制 (一)

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

最新文章

  1. 使用python制作神经网络——搭建框架
  2. 进一步了解 apt-get 的几个命令
  3. 扫地机器人返充原理_扫地机器人全解析
  4. 【AI视野·今日CV 计算机视觉论文速览 第210期】Tue, 1 Jun 2021
  5. 扎克伯格拒绝参加加拿大议会 或因藐视罪名被拘留
  6. LMbench - Tools for Performance Analysis | 内核基准测试
  7. 酷似美军作战模式的中台战略,究竟是怎么回事? | 大咖说中台
  8. 微信飞机大战小游戏制作分享(上集)含素材视频教程
  9. 产品经理的自我修养——用显微镜看微信产品设计
  10. Adobe FLASH CS6 安装错误解决方法
  11. 爱心的数学函数方程_数学里有哪些可以示爱的图像?它们的函数方程又是什么?...
  12. 【Python】UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe
  13. 显微镜下的大明——第一个故事
  14. 基于 DolphinDB 的行情中心解决方案
  15. Spring Cloud入门+深入(十二)-Gateway网关(一)
  16. 我的msn的博客 欢迎大家点击
  17. 南传法句经(摘选)03
  18. 全志A40I sdk wifi 模块移植说明文档
  19. QQ能上,但是网页打不开?
  20. python连乘函数_(Python3) 连加 连乘 代码

热门文章

  1. java怎么改默认工作区_如何更改缺省JRE所有的Eclipse工作区?(How to change default JRE...
  2. 网络安全笔记(宏病毒)
  3. matlab nan 无色_科学网—Matlab 关于NaN值的填充 - 肖鑫的博文
  4. GPS模块输出数据的解释
  5. 电商用户行为预测数据初探
  6. java借书记录归还时间问题_关于B-E00007-图书借阅管理系统bug修复总结
  7. tcpdump manual 中文翻译
  8. mysql通过集合查询_连接查询与集合查询
  9. socket中的read()
  10. Java中的 分号 ;