目录

一、什么是反射

二、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.reflectModifier接口的一个方法--->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反射机制的基本使用相关推荐

  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. 吴 恩 达 教 你 做 机 器 学 习 职 业 规 划
  2. C代码开发遇到的问题 变量初始化和结构体指针移动
  3. Java多线程之线程封闭(三)
  4. python如何绘制曲线图_只会柱状图、饼状图、折线图怎么行,来用Python画个热力图...
  5. beast单元库的总结
  6. 3.9 创建数据类型
  7. Java一只青蛙每次跳3米_行测丨青蛙跳5米下滑3米?怎么办!
  8. 【elasticsearch】bulk api奇特的json格式的原因
  9. 【译】Serverless Jenkins with Jenkins X
  10. HCIE-Security Day7:6个实验理解目的NAT
  11. linux 解压 WinRAR 压缩文件
  12. SpringBoot 错误:Field userService in com.lyh.Controller.UserController required a bean of...
  13. HDU 4357 字符交换位置无数次变成另一个字符串-YY-(神题
  14. 采用云原生架构:架构演进和成熟度
  15. BUUCTF 九连环
  16. idata 单片机 新唐_【nuvoton新唐8051单片机】NuTiny-SDK-N76E003开发板
  17. favicon.ico文件简介
  18. 产品经理和项目经理的差异
  19. 低于90分的成绩 java_查询平均成绩低于60分的学生学号、姓名及成绩。
  20. 《手机拍照与视频》那点事

热门文章

  1. 10步教你来优化WordPress速度 为服务器和访客减压
  2. 操作系统——文件目录+对磁盘的管理
  3. 衡量计算机网络性能的指标
  4. 计算机结构体系ppt,计算机体系结构-浙江大学课件.ppt
  5. 质量管理新理念——以员工为中心
  6. HTML5-前端开发很火且工资很高?
  7. 【云原生 | 初识篇】带你走进Docker的未知宇宙
  8. opencv实现将raw图像转换为bmp图像(C++)
  9. 云计算,大数据,AI三者的关系如何?
  10. win10饥荒服务器未响应,win10系统电脑运行饥荒闪退的解决方法