Java-反射

一、什么是反射?

反射允许对封装类的成员变量,成员方法和构造方法的信息进行编程访问。

反射可以把成员变量、成员方法、构造方法挨个儿的都获取出来,并对它们进行操作。

IDEA中自动提示的功能就是用反射来做的。
在这里插入图片描述

Ctrl+p:快捷键,获取方法的形参,也是利用的反射。
在这里插入图片描述

  • 反射可以获取类中的成员变量、成员方法、构造方法。获取是从Class字节码文件中获取的。
  • 反射可以解刨成员变量、成员方法、构造方法中的信息。

添加图片注释,不超过 140 字(可选)

先获取Class对象,再从Class对象中获取成员变量、成员方法、构造方法,再去解刨获取其中的每一个具体的信息。

二、获取class对象的三种方式

  1. Class.forName(“全类名”);
  2. 类名.class;
  3. 对象.getClass();

三种方式的使用场景:
在这里插入图片描述

        //第一种方式(最常用)Class clazz1 = Class.forName("myreflect.Student");//第二种方式(一般当做参数进行传递)Class clazz2 = Student.class;//第三种方式(有这个类的对象的时候使用)Student s = new Student();Class clazz3 = s.getClass();

三、反射获取构造方法

在Java中万物皆对象

例如:Constructor类的对象就是构造方法的对象。
在这里插入图片描述
在这里插入图片描述
Student类中的内容:

package myreflect;public class Student {private String name;private int age;public Student() {}public Student(String name) {this.name = name;}protected Student(int age) {this.age = age;}private Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

测试反射类中的主要内容:

        //1、获取class字节码文件对象Class clazz = Class.forName("myreflect.Student");//2、返回所有公共构造方法对象的数组Constructor[] cons1 = clazz.getConstructors();for (Constructor con : cons1) {System.out.println(con);}System.out.println("-------------");//3、返回所有构造方法的数组Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor con : cons2) {System.out.println(con);}System.out.println("-------------");//4、返回单个公共构造方法对象Constructor con1 = clazz.getConstructor(String.class);System.out.println(con1);System.out.println("-------------");//5、获取private修饰的构造方法Constructor con2 = clazz.getDeclaredConstructor(String.class,int.class);System.out.println(con2);System.out.println("-------------");//6、获取权限修饰符,是通过整数的形式来体现的。int modifiers = con2.getModifiers();System.out.println(modifiers);System.out.println("-------------");//7、利用反射创建对象con2.setAccessible(true); //表示临时取消权限校验(暴力反射)Student stu = (Student) con2.newInstance("赵六", 28);System.out.println(stu);

权限修饰符所对应的数字:
在这里插入图片描述

四、反射获取成员变量

添加图片注释,不超过 140 字(可选)

Student类中的内容:

package myreflect2;public class Student {private String name;private int age;public String gender;public Student() {}public Student(String name, int age, String gender) {this.name = name;this.age = age;this.gender = gender;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}

测试类中的主要内容:

package myreflect2;
import java.lang.reflect.Field;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {//1、获取class字节码对象Class clazz = Class.forName("myreflect2.Student");//2.1、获取所有公共的成员变量Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field);}//2.2、获取所有的成员变量System.out.println("-------");Field[] fields2 = clazz.getDeclaredFields();for (Field field : fields2) {System.out.println(field);}//3.1、获取单个的成员变量(公共的)System.out.println("-------");Field gender = clazz.getField("gender");//3.2、获取单个的成员变量System.out.println("-------");Field name = clazz.getDeclaredField("name");//4、获取权限修饰符int modifiers = name.getModifiers();System.out.println(modifiers);//5、获取成员变量的名字System.out.println("-------");String name1 = name.getName();System.out.println(name1);//6、获取成员变量的数据类型System.out.println("-------");Class<?> type = name.getType();System.out.println(type);//7、获取成员变量记录的值System.out.println("-------");Student stu = new Student("zhansan",14,"nan");name.setAccessible(true); //临时取消权限校验Object o = name.get(stu);System.out.println(o);//8、修改对象里面记录的值System.out.println("-------");name.set(stu,"zhaoliu");System.out.println(stu);}
}

五、反射获取成员方法

添加图片注释,不超过 140 字(可选)

Student类中的内容:

package myreflect3;import java.io.IOError;
import java.io.IOException;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void sleep(){System.out.println("睡觉");}private String eat(String something) throws IOException,IndexOutOfBoundsException{System.out.println("在吃" + something);return "吃饱了";}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

测试类中的内容:

package myreflect3;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//1、获取class字节码文件对象Class clazz = Class.forName("myreflect3.Student");//2、获取所有公共的方法对象(包含父类中所有的公共方法)Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println(method);}//3、获取里面所有方法对象(不包含父类的 但是 可以获取本类中私有的成员方法)Method[] declaredMethods = clazz.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println(declaredMethod);}//4、获取指定的单一方法//第一个参数:方法的名称//第二个参数:方法中形参的类型(具备形参的类型是考虑到方法重载的问题)Method eat = clazz.getDeclaredMethod("eat", String.class);//5、获取方法的修饰符int modifiers = eat.getModifiers();System.out.println(modifiers);//6、获取方法的名字String name = eat.getName();System.out.println(name);//7、获取方法的形参Parameter[] parameters = eat.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}//8、获取方法抛出的异常Class[] exceptionTypes = eat.getExceptionTypes();for (Class exceptionType : exceptionTypes) {System.out.println(exceptionType);}//9、运行方法Student stu = new Student();eat.setAccessible(true);eat.invoke(stu,"米饭"); //第一个参数是对象,第二个参数是eat方法中要传递的值//用 stu对象 去调用 其中的 eat方法 传递的参数 是 "米饭"。//10、获取方法的返回值String result = (String) eat.invoke(stu, "小米粥");System.out.println(result);}
}

六、反射的作用

1、获取一个类里面的所有的信息,获取到之后,再执行其他的业务逻辑

2、结合配置文件,动态的创建对象并调用方法。

七、练习一

保存信息:对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去。

添加图片注释,不超过 140 字(可选)

主要代码:

package myreflect4;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;public class Demo {public static void main(String[] args) throws IllegalAccessException, IOException {//对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去。Student stu = new Student("小n",23,'女',168.5f,"玩游戏");Teacher t = new Teacher("zhangsan",10000);saveObject(stu);}//把对象里面所有的成员变量名和值保存到本地文件中public static void saveObject(Object obj) throws IllegalAccessException, IOException {//获取字节码文件的对象Class clazz = obj.getClass();//创建IO流BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));//获取所有的成员变量Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {//取消临时权限校验declaredField.setAccessible(true);//获取变量的名字String name = declaredField.getName();//获取变量中的值Object value = declaredField.get(obj);//写入文件中数据bw.write(name+"="+value);//写一行,换一行bw.newLine();}bw.close();}
}

八、练习二

反射可以和配置文件相结合,动态的创建对象,并调用方法

Student类中内容:

package myreflect5;public class Student {private String name;private int age;public void study(){System.out.println("学生在学习!");}public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

Teacher类中内容:

package myreflect5;public class Teacher {private String name;private int salary;public Teacher() {}public void teach(){System.out.println("老师在教书!");}public Teacher(String name, int salary) {this.name = name;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", salary=" + salary +'}';}
}

prop.properties文件中内容:

classname=myreflect5.Teacher
method=teach

测试类中内容:

package myreflect5;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class Demo {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//1、读取配置文件中的信息Properties prop = new Properties();FileInputStream fis = new FileInputStream("prop.properties");prop.load(fis);fis.close();System.out.println(prop);//2、获取全类名和方法名String className = (String) prop.get("classname");String methodName = (String) prop.get("method");System.out.println(className);System.out.println(methodName);//3、利用反射创建对象并运行方法Class clazz = Class.forName(className);//4、获取构造方法Constructor con = clazz.getDeclaredConstructor();Object o = con.newInstance();System.out.println(o);//5、获取成员方法并运行Method method = clazz.getDeclaredMethod(methodName);method.setAccessible(true);method.invoke(o);}
}

九、总结

添加图片注释,不超过 140 字(可选)

power by 黑马

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/589084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题

Java项目调试实战&#xff1a;如何高效调试Spring Boot项目中的GET请求&#xff0c;并通过equalsIgnoreCase解决大小写不一致问题 写在最前面全部过程Java equalsIgnoreCase() 方法idea中如何调试SpringBoot项目在IntelliJ IDEA中使用内置HTTP客户端设置断点和调试 补充&#x…

vu3-14

第一个需求是在用户登录成功之后&#xff0c;在主页显示用户的真实姓名和性别&#xff0c;这些信息要调用后端API获取数据库里面的信息&#xff0c;第二个需求是点击菜单1&#xff0c;在表单中修改用户信息之后&#xff0c;更新到后端数据库&#xff0c;然后在主页同步更新用户…

FA模板制作

1、链接克隆模板的制作 &#xff08;1&#xff09;安装一个全新的Windows 10&#xff0c;挂载并安装tools&#xff0c;关闭防火墙 &#xff08;2&#xff09;挂载FusionAccess_WindowsDestop_Install_6.5.1.iso后启用本地Administrator本地超管&#xff0c;切换为本地超管&am…

spring、springmvc、springboot、springcloud简介

spring简介 spring是什么&#xff1f; spring: 春天spring: 轻量级的控制反转和面向切面编程的框架 历史 2002年&#xff0c;首次推出spring雏形&#xff0c;interface 21框架2004年&#xff0c;发布1.0版本Rod Johnson: 创始人&#xff0c;悉尼大学&#xff0c;音乐学博士…

Nexus私服简介及搭建(Linux3.62版本)

文章目录 一、Nexus的安装1、运行程序2、查看运行日志和初始密码3、启动配置文件的修改 二、Nexus的使用1、Nexus使用流程说明2、库类型说明2.1、maven-public库配置说明2.2、maven-central库配置说明 3、用户本地配置使用maven-public库3.1、禁用了匿名访问&#xff0c;额外需…

test mock-03-wiremock 模拟 HTTP 服务的开源工具 flexible and open source API mocking

拓展阅读 test 之 jmockit-01-overview jmockit-01-test 之 jmockit 入门使用案例 mockito-01-overview mockito 简介及入门使用 PowerMock Mock Server ChaosBlade-01-测试混沌工程平台整体介绍 jvm-sandbox 入门简介 wiremock WireMock是一个流行的开源工具&#xf…

DFA 算法实现敏感词过滤

背景 项目中APP端发帖&#xff0c;评论可能包含多个关键词&#xff0c;铭感词。此时需要对该内容进行过滤处理。此前都是在客户端层面操作&#xff0c;这样不仅带来了性能的损耗&#xff0c;而且新增铭感词时&#xff0c;需要客户端重新打包上架&#xff0c;显得十分不合理。所…

R306指纹识别模块指令系统

一&#xff1a;指令集 1. GR_GetImage 指令代码&#xff1a;01H 功能&#xff1a;从传感器上读入图像存于图像缓冲区 2. GR_GenChar 指令代码&#xff1a;02H 功能&#xff1a;根据原始图像生成指纹特征存于 CharBuffer1 或 CharBuffer2 3. GR_Match 指令代码&#xff…

SpringCloud(H版alibaba)框架开发教程,使用eureka,zookeeper,consul,nacos做注册中心——附源码(1)

源码地址&#xff1a;https://gitee.com/jackXUYY/springboot-example 创建订单服务&#xff0c;支付服务&#xff0c;公共api服务&#xff08;共用的实体&#xff09;&#xff0c;eureka服务 1.cloud-consumer-order80 2.cloud-provider-payment8001 3.cloud-api-commons 4.…

kubeadm来搭建k8s集群。

我们采用了二进制包搭建出的k8s集群&#xff0c;本次我们采用更为简单的kubeadm的方式来搭建k8s集群。 二进制的搭建更适合50台主机以上的大集群&#xff0c;kubeadm更适合中小型企业的集群搭建 主机配置建议&#xff1a;2c 4G 主机节点 IP …

Spring@Scheduled定时任务与SQLSERVER distinct order by的错误吞噬

目录 Scheduled 提供的调度机制 遇到错误不会抛出 数据库SQL差异 Scheduled 提供的调度机制 cronzonefixedDelayfixedDelayStringfixedRatefixedRateStringinitialDelayinitialDelayString 上面具体怎么用自己代码定位到API上去看注释说明。 遇到错误不会抛出 在SqlSe…

【力扣题解】P700-二叉搜索树中的搜索-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P700-二叉搜索树中的搜索-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f…

智慧园区物联综合管理平台之架构简述

总体架构 系统总体划分为物联感知系统层、 核心平台层、 综合运营服务平台和展示层四部分。 物联感知系统层 物联感知系统主要是支撑园区智能化运行的各子系统, 包括门禁系统、 视频监控系统、 车辆管理系统等。 核心平台层 核心平台层包括: 园区物联综合管理平台和园区…

x-cmd pkg | gum - 很好看的终端 UI 命令行工具

目录 简介首次用户功能特点Bubbles 与 Lip Gloss进一步探索 简介 gum 由 Charm 组织于 2022 年使用 Go 语言开发。旨在帮助用户编写 Shell 脚本与 dotfiles 时提供一系列快捷使用&#xff0c;可配置&#xff0c;可交互&#xff0c;美观的 Terminal UI 组件。 首次用户 使用 x…

[Angular] 笔记 25:指令

组件指令 (chatgpt 回答) 在 Angular 中&#xff0c;组件本身可以被视为指令&#xff0c;这种指令被称为组件指令。组件是 Angular 应用的构建块之一&#xff0c;它封装了一段具有特定功能和特性的用户界面&#xff0c;并且可以在应用中重复使用。 组件指令具有以下特征&…

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…

Docker九 | Swarm mode

目录 Swarm基本概念 节点 服务和任务 创建Swarm集群 创建管理节点 增加工作节点 查看集群 部署服务 新建服务 查看服务 服务伸缩 增加服务 减少服务 删除服务 Swarm基本概念 节点 节点分为管理节点(manager)和工作节点(worker) 管理节点 管理节点用于Swarm集群的…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPISDK获…

Django 学习教程-介绍与安装

系列 Django 学习教程-第一个 Django 应用-CSDN博客 介绍 Django 是一个高级 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。 它由经验丰富的开发人员构建&#xff0c;解决了 Web 开发的大部分麻烦&#xff0c;因此您可以专注于在编写应用程序时无需重新发…

自定义事件

自定义事件 自定义事件 AAA"fn1"&#xff1a;向子组件的事件池中注入AAA事件&#xff0c;方法是父组件的fn1 发布订阅&#xff1a;子组件某个操作把父组件中的某个方法执行了 参数可以传多个 $listeners* $listeners&#xff1a;事件池中的方法 { aaa:fn1, bbb:fn2 }…