Java反射机制的基本使用
目录
一、什么是反射
二、java.lang.Class类类
三、反射如何实例化
四、反射动态方法的调用
五、反射如何读写属性
六、反射如何访问属性修饰符
一、什么是反射
反射就是Java语言中的一种机制,
通过这种机制可以动态的实例化对象、读写属性、调用方法。
二、java.lang.Class类类
我们需要使用Java反射机制的话就必须要先获得你想操作的类的java.lang.Class对象;
然后接下来我们就来一起了解一下类类的几种获取方式吧:
我们先放上学习案例需要的一个实体类:Student
package com.leaf.reflect;/*** 实体类:学生类* @author Leaf** 2022年6月16日 下午9:51:06*/
public class Student {private String sid;private String sname;public Integer age;static{System.out.println("加载进jvm中!");}public Student() {super();System.out.println("调用无参构造方法创建了一个学生对象");}public Student(String sid) {super();this.sid = sid;System.out.println("调用带一个参数的构造方法创建了一个学生对象");}public Student(String sid, String sname) {super();this.sid = sid;this.sname = sname;System.out.println("调用带二个参数的构造方法创建了一个学生对象");}@SuppressWarnings("unused")private Student(Integer age) {System.out.println("调用Student类私有的构造方法创建一个学生对象");this.age = age;}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public void hello() {System.out.println("你好!我是" + this.sname);}public void hello(String name) {System.out.println(name + "你好!我是" + this.sname);}@SuppressWarnings("unused")private Integer add(Integer a, Integer b) {return new Integer(a.intValue() + b.intValue());}
}
获取Class对象的三种方式:
2.1 类.class
//1、类.class
Class cl1 = Student.class;
2.2 类实例.getClass()
//2、类实例.getClass()
Student stu = new Student();
Class cl2 = stu.getClass();
2.3 Class.forName("类的全路径名");
//3、Class.forName("类的全路径名");
Class cl3 = Class.forName("com.leaf.reflect.Student");
三、反射如何实例化
使用Java反射机制的第一步获取Class的三种方式我们都了解过了,
接下来我们就来了解一下如何用反射来实例化一个对象吧:
我们以前一般实例化一个对象是这样做的:
Student stu = new Student();
而接下来我们就看看用反射又如何来实例化:
3.1 第一步还是获取Class类:
//获取类类
Class<? extends Student> cl1 = stu1.getClass();
3.2 无参的 共有的构造函数:
1、无参数 共有的构造方法
Student stu = cl1.newInstance();
3.3 有参数 共有的构造方法:
2、有参数 共有的构造方法
//拿到构造器对象 三个点代表可以传n个参数--->拿到一个参数为String的构造器对象
Constructor<? extends Student> c1 = cl1.getConstructor(String.class);
Student stu5 = c1.newInstance("s001");
3.4 拿到有多个参数 共有的构造方法:
3、拿到有多个参数 共有的构造方法
Constructor<? extends Student> c2 = cl1.getConstructor(String.class,String.class);
Student stu6 = c2.newInstance("s002","颠婆");
3.5 私有的构造方法:
4、私有的构造方法
//getConstructor只能获取共有的构造方法,要获取私有的构造器getDeclaredConstructor
Constructor<? extends Student> c3 = cl1.getDeclaredConstructor(Integer.class);
//打开访问权限
c3.setAccessible(true);
Student stu = c3.newInstance(19);
我们可以看到调用的实体类的方法运行结果:
最后总结一下反射机制实例化对象的步骤以及注意点:
1)拿到Class类;
2)Class类点newInstance();--->没有参数的实例化
3)有参数的实例化还要拿到构造器对象: Class类点getConstructor("参数的类型.class");
再用构造器对象点newInstance();
4)如果是私有的构造方法还就需要拿到私有的构造器对象:
Class类点getDeclaredConstructor("参数的类型.class");
然后再打开访问权限:构造器对象点setAccessible(true);
最后再用构造器对象点newInstance();
四、反射动态方法的调用
如何使用反射机制动态调用方法呢?一起来看看吧:
4.1 第一步还是先拿到类类:类点Class
/*调用无参的 共有方法*/
1、拿到类类
Class<Student> cl1 = Student.class;
4.2 拿到方法对象:getMethod("方法名");
2、拿到方法对象
//name:方法名 parameterTypes:方法对应的参数类型
Method m1 = cl1.getMethod("hello");
4.3 调用对应的方法:invoke(类实例, "参数");
3、调用对应的方法
//第一个参数:类实例 第二个参数:方法调用时的实际参数
//m1.invoke方法调用的返回值就是方法对象本身hello方法的返回值
Object invoke = m1.invoke(cl1.newInstance());
我们打印测试一下:
由于方法是void无返回,所以值为null,
但是根据文章开头提供的案例类Student可以发现方法已经成功调用~
还有有参以及私有方法的调用,步骤基本一致,这里就直接放上代码了:
/*调用1个有参的 共有方法*/
Method m2 = cl1.getMethod("hello", String.class);
Object invoke2 = m2.invoke(cl1.newInstance(), "邓正威");
System.out.println(invoke2);
运行结果:
/*调用2个有参的 私有方法*/
//拿到私有方法对象
Method m3 = cl1.getDeclaredMethod("add", Integer.class,Integer.class);
//打开权限
m3.setAccessible(true);
//调用方法参数1+参数2
Object invoke3 = m3.invoke(cl1.newInstance(), 10,7);
//打印结果
System.out.println(invoke3);
运行结果:
我们还是总结一下Java机制动态调用方法的步骤:
/**
* 步骤:
* 1、拿到类类
* 2、拿到方法对象
* 3、调用对应的方法
*/
五、反射如何读写属性
学会了如何使用Java机制调用方法后我们再来看看如何读写属性吧:
实例化一个Student类:
Student stu = new Student("s009","Leaf");
然后我们再来看看这个案例需求:拿到这个学生所有的属性及属性值;
这时我们平常可能就是这样做的:
需求:拿到这个学生所有的属性及属性值System.out.println("Sid:"+stu.getSid());System.out.println("Sname:"+stu.getSname());System.out.println("Age:"+stu.age);
是的,这样我们也能得到结果,简单快捷,但是,这样的代码也有着诸多问题:
/**
* 上述代码存在的问题:
* 1、要知道这个类有哪些属性
* 2、假设student有多个属性?
*/
5.1 这个时候我们就可以用到我们的Java反射啦:先拿到Class类类
//一切反射从类类开始
Class<? extends Student> cl1 = stu.getClass();
5.2 拿到当前类所有的属性对象:getDeclaredFields();
Field[] fields = cl1.getDeclaredFields();
System.out.println("属性数量:"+fields.length);
5.3 循环遍历:
注意--->当属性是私有化修饰的时候记得打开访问权限~
//循环遍历属性对象 f:每一个属性对象
for (Field f : fields) {
//打开访问权限
f.setAccessible(true);
//通过属性对象拿到属性名称
System.out.print(f.getName()+": ");
//通过此类实例拿到当前属性对象的属性值
System.out.println(f.get("类实例stu"));
}
运行结果:
六、反射如何访问属性修饰符
当我们能够成功读写到属性值后,
这想要访问这些属性的修饰符时,
就可以使用java.lang.reflect中Modifier接口的一个方法--->getModifiers()
我们这个时候回到上一标题获取属性值的循环遍历步骤:
//一切反射从类类开始Class<? extends Student> cl1 = stu.getClass();//当前类所有的属性对象Field[] fields = cl1.getDeclaredFields();//循环遍历属性对象 f:每一个属性对象for (Field f : fields) {//打开访问权限f.setAccessible(true);}
这个时候我们就用属性对象点getModifiers()
//循环遍历属性对象 f:每一个属性对象
for (Field f : fields) {//打开访问权限f.setAccessible(true);//获取属性的修饰符int i = f.getModifiers();
}
它返回的是一个修饰符整型数字,很难分辨这是什么修饰符,
于是我们可以用Modifier接口的toString(修饰符数字)方法转换为修饰符:
Modifier.toString(修饰符数字)
//循环遍历属性对象 f:每一个属性对象
for (Field f : fields) {//打开访问权限f.setAccessible(true);//获取属性的修饰符int i = f.getModifiers();System.out.println(f.getName()+"的修饰符是:"+Modifier.toString(i));
}
我们运行看看:
OK,今天Leaf的学习笔记分享就到这里啦,后面也还会有更多的Java学习分享,喜欢的可以关注一起学习噢~有问题都可以私信俺!我们下次再见啦!!!
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 ...
最新文章
- 吴 恩 达 教 你 做 机 器 学 习 职 业 规 划
- C代码开发遇到的问题 变量初始化和结构体指针移动
- Java多线程之线程封闭(三)
- python如何绘制曲线图_只会柱状图、饼状图、折线图怎么行,来用Python画个热力图...
- beast单元库的总结
- 3.9 创建数据类型
- Java一只青蛙每次跳3米_行测丨青蛙跳5米下滑3米?怎么办!
- 【elasticsearch】bulk api奇特的json格式的原因
- 【译】Serverless Jenkins with Jenkins X
- HCIE-Security Day7:6个实验理解目的NAT
- linux 解压 WinRAR 压缩文件
- SpringBoot 错误:Field userService in com.lyh.Controller.UserController required a bean of...
- HDU 4357 字符交换位置无数次变成另一个字符串-YY-(神题
- 采用云原生架构:架构演进和成熟度
- BUUCTF 九连环
- idata 单片机 新唐_【nuvoton新唐8051单片机】NuTiny-SDK-N76E003开发板
- favicon.ico文件简介
- 产品经理和项目经理的差异
- 低于90分的成绩 java_查询平均成绩低于60分的学生学号、姓名及成绩。
- 《手机拍照与视频》那点事