Java---反射机制
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---反射机制相关推荐
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...
Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn 发布于:2012-09-15 ...
- Java反射机制分析指南
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- 反射 字段_详解面试中常考的 Java 反射机制
反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...
- 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】...
方法1:通过get()方法获取属性值 package com.sxd.test.controller;public class FirstCa{private Integer num;private ...
- java基础-java反射机制
2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...
- 利用java反射机制进行对象操作
我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...
- java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点
关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...
- java继承 映射_hibernate继承关系映射和java反射机制的运用
转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...
- java初反射_初始 java 反射机制 (一)
反射机制详解 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为j ...
最新文章
- 使用python制作神经网络——搭建框架
- 进一步了解 apt-get 的几个命令
- 扫地机器人返充原理_扫地机器人全解析
- 【AI视野·今日CV 计算机视觉论文速览 第210期】Tue, 1 Jun 2021
- 扎克伯格拒绝参加加拿大议会 或因藐视罪名被拘留
- LMbench - Tools for Performance Analysis | 内核基准测试
- 酷似美军作战模式的中台战略,究竟是怎么回事? | 大咖说中台
- 微信飞机大战小游戏制作分享(上集)含素材视频教程
- 产品经理的自我修养——用显微镜看微信产品设计
- Adobe FLASH CS6 安装错误解决方法
- 爱心的数学函数方程_数学里有哪些可以示爱的图像?它们的函数方程又是什么?...
- 【Python】UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe
- 显微镜下的大明——第一个故事
- 基于 DolphinDB 的行情中心解决方案
- Spring Cloud入门+深入(十二)-Gateway网关(一)
- 我的msn的博客 欢迎大家点击
- 南传法句经(摘选)03
- 全志A40I sdk wifi 模块移植说明文档
- QQ能上,但是网页打不开?
- python连乘函数_(Python3) 连加 连乘 代码
热门文章
- java怎么改默认工作区_如何更改缺省JRE所有的Eclipse工作区?(How to change default JRE...
- 网络安全笔记(宏病毒)
- matlab nan 无色_科学网—Matlab 关于NaN值的填充 - 肖鑫的博文
- GPS模块输出数据的解释
- 电商用户行为预测数据初探
- java借书记录归还时间问题_关于B-E00007-图书借阅管理系统bug修复总结
- tcpdump manual 中文翻译
- mysql通过集合查询_连接查询与集合查询
- socket中的read()
- Java中的 分号 ;