Java-反射
反射概述
Java反射机制:
- 是指在运行时去获取一个类的变量和方法信息。
- 然后通过获取的信息来创建对象,调用方法的一种机制。
- 由于这种<动态性>,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。
获取Class类的对象

案例:
//Student类
public class Student {/*** 成员变量:私有,默认,公共*/private String name;int age;public String address;//构造方法:一个私有,一个默认,两个公共public Student() {}private Student(String name) {this.name = name;}Student(String name, int age) {this.name = name;this.age = age;}public Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}/*** 成员方法:一个私有,四个公共*/private void function() {System.out.println("function");}public void method1() {System.out.println("method");}public void method2(String s) {System.out.println("method:" + s);}public String method3(String s, int i) {return s + "," + i;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';}
}
public class Demo {public static void main(String[] args) throws ClassNotFoundException {//使用类的class属性获取该类对应的Class对象Class<Student> c1 = Student.class;System.out.println(c1);//一个类在内存中只有一个字节码文件对象Class<Student> c2 = Student.class;System.out.println(c1 == c2);System.out.println("-------------------");/*通过调用对象的getClass()方法,返回对象所属类的class对象该方法是Object类中的方法,所有的Java对象都可以调用该方法*/Student stu = new Student();Class<? extends Student> c3 = stu.getClass();System.out.println(c1 == c3);System.out.println("-------------------");//使用Class类中的静态方法forName(String className),返回对象所属类的class对象Class<?> c4 = Class.forName("com.fanshe.Student");System.out.println(c1 == c4);}
}
运行结果:
class com.fanshe.Student
true
-------------------
true
-------------------
true
反射获取构造方法并使用
- getConstructors():返回一个数组,包含该Class对象中的public公共构造函数
- getDeclaredConstructors():返回一个数组,包含该Class对象中的所有构造函数
- getConstructor(参数列表):获取指定的公共构造函数对象
- getDeclaredConstructor(参数列表):获取指定的构造函数对象
- newInstance(参数):构造方法创建对象
- setAccessible(boolean flag):值为true时取消访问检查
练习:
public class Demo2 {public static void main(String[] args) throws Exception {//获取Class对象Class<?> c = Class.forName("com.fanshe.Student");//getConstructors():返回一个数组,包含该Class对象中的public公共构造函数Constructor<?>[] cons = c.getConstructors();System.out.println("公共构造函数:");for (Constructor<?> con : cons) {System.out.println(con);}//getDeclaredConstructors():返回一个数组,包含该Class对象中的所有构造函数Constructor<?>[] dCons = c.getDeclaredConstructors();System.out.println("所有构造函数:");for (Constructor<?> dCon : dCons) {System.out.println(dCon);}System.out.println("指定的公共构造函数1:");//getConstructor():返回指定的公共构造函数的对象//参数:构造方法的参数 和 数据类型对应的字节码文件对象(Class对象)Constructor<?> con = c.getConstructor();//公共构造函数的对象使用newInstance()创建实例对象//newInstance():构造方法创建对象Object obj = con.newInstance();System.out.println(obj);System.out.println("指定的公共构造函数2:");//基本数据类型 也可以通过.class 得到对应的Class类型System.out.println(c.getConstructor(String.class, int.class, String.class).newInstance("李白",22,"西安"));System.out.println("指定的构造函数");//getDeclaredConstructor():获取指定的构造函数//参数:构造方法的参数 和 数据类型对应的字节码文件对象(Class对象)Constructor<?> dCon = c.getDeclaredConstructor(String.class);//setAccessible():值为true时取消访问检查dCon.setAccessible(true);System.out.println(dCon.newInstance("杨玉环"));}
}
运行结果:
公共构造函数:
public com.fanshe.Student(java.lang.String,int,java.lang.String)
public com.fanshe.Student()
所有构造函数:
public com.fanshe.Student(java.lang.String,int,java.lang.String)
com.fanshe.Student(java.lang.String,int)
private com.fanshe.Student(java.lang.String)
public com.fanshe.Student()
指定的公共构造函数1:
Student{name='null', age=0, address='null'}
指定的公共构造函数2:
Student{name='李白', age=22, address='西安'}
指定的构造函数
Student{name='杨玉环', age=0, address='null'}
反射获取成员变量并使用
Class类中用于获取成员变量的方法
- getFields():获取公共的成员变量
- getDeclaredFields():获取所有的成员变量
- getField(成员变量):获取指定的公共成员变量
- getDeclaredField(成员变量):获取指定的成员变量
Field类中,给成员变量赋值的方法
- set(Object obj,Object value):给obj方法实例中的成员变量赋值
练习:
public class Demo3 {public static void main(String[] args) throws Exception {//获取Class对象Class<?> c = Class.forName("com.fanshe.Student");//getFields():获取公共的成员变量Field[] fields = c.getFields();System.out.println("获取公共的成员变量:");for (Field field : fields) {System.out.println(field);}//getDeclaredFields():获取所有的成员变量Field[] df = c.getDeclaredFields();System.out.println("获取所有的成员变量:");for (Field field : df) {System.out.println(field);}System.out.println("获取指定的公共成员变量并赋值,再创建对象:");//获取指定的公共成员变量Field addressField = c.getField("address");//获取指定的公共构造方法,并创建方法实例Object obj = c.getConstructor().newInstance();//给方法中的成员变量赋值addressField.set(obj,"西安");//输出方法实例(对象)System.out.println(obj);System.out.println("获取指定的公共构造函数对象,再实例化对象:");//获取单个公共方法Constructor<?> con = c.getConstructor();//创建方法实例Object obj1 = con.newInstance();System.out.println(obj1);System.out.println("获取指定的成员变量并赋值,再实例化对象:");//获取指定的成员变量Field nameField = c.getDeclaredField("name");Field ageField = c.getDeclaredField("age");Field addField = c.getDeclaredField("address");//取消访问检查nameField.setAccessible(true);ageField.setAccessible(true);addField.setAccessible(true);//给成员变量赋值nameField.set(obj1,"胡辣汤");ageField.set(obj1,10);addField.set(obj1,"北京");//输出对象System.out.println(obj1);}
}
运行结果:
获取公共的成员变量:
public java.lang.String com.fanshe.Student.address
获取所有的成员变量:
private java.lang.String com.fanshe.Student.name
int com.fanshe.Student.age
public java.lang.String com.fanshe.Student.address
获取指定的公共成员变量并赋值,再创建对象:
Student{name='null', age=0, address='西安'}
获取指定的公共构造函数对象,再实例化对象:
Student{name='null', age=0, address='null'}
获取指定的成员变量并赋值,再实例化对象:
Student{name='胡辣汤', age=10, address='北京'}
反射获取成员方法并使用
Class类中用于获取成员方法的方法
- getMethods():获取全部的公共成员方法数组,包含继承的方法
- getDeclaredMethods():获取全部的成员方法数组,不包含继承的方法
- getMethod(“方法名”,参数类型.class):获取单个公共成员方法对象
- getDeclaredMethod(“方法名”,参数类型.class):获取单个成员方法对象
Method类中用于调用成员方法的方法
- invoke(实体类对象,方法参数列表):调用实体类对象的成员方法
练习:
public class Demo4 {public static void main(String[] args) throws Exception {//获取Class对象Class<?> c = Class.forName("com.fanshe.Student");System.out.println("获取全部的公共成员方法:");//getMethods():获取全部的公共成员方法,包含继承的方法Method[] methods = c.getMethods();for (Method method : methods) {System.out.println(method);}System.out.println("获取全部的成员方法:");//getDeclaredMethods():获取全部的成员方法,不包含继承的方法Method[] dms = c.getDeclaredMethods();for (Method dm : dms) {System.out.println(dm);}System.out.println("获取单个的公共成员方法1:");//getMethod("方法名",参数类型.class):获取单个的公共成员方法对象Method method1 = c.getMethod("method1");//获取无参构造方法,创建实体类对象Object obj1 = c.getConstructor().newInstance();//invoke(实体类对象,方法参数列表):调用对象的成员方法method1.invoke(obj1);System.out.println("获取单个的公共成员方法2:");Method method2 = c.getMethod("method2",String.class);method2.invoke(obj1,"马超");System.out.println("获取单个的公共成员方法3:");Method method3 = c.getMethod("method3", String.class, int.class);//有返回值,先接收一下Object obj2 = method3.invoke(obj1, "赵云", 22);//输出返回结果System.out.println(obj2);System.out.println("获取单个的成员方法:");//getDeclaredMethod("方法名",参数类型):获取单个的成员方法对象Method dm = c.getDeclaredMethod("function");//取消访问检查dm.setAccessible(true);dm.invoke(obj1);}
}
运行结果:
获取全部的公共成员方法:
public java.lang.String com.fanshe.Student.toString()
public void com.fanshe.Student.method1()
public java.lang.String com.fanshe.Student.method3(java.lang.String,int)
public void com.fanshe.Student.method2(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
获取全部的成员方法:
public java.lang.String com.fanshe.Student.toString()
private void com.fanshe.Student.function()
public void com.fanshe.Student.method1()
public java.lang.String com.fanshe.Student.method3(java.lang.String,int)
public void com.fanshe.Student.method2(java.lang.String)
获取单个的公共成员方法1:
method
获取单个的公共成员方法2:
method:马超
获取单个的公共成员方法3:
赵云,22
获取单个的成员方法:
function
反射练习-越过泛型检查
如何实现在ArrayList< Integer >集合中添加一个字符串数据?
public class Demo5 {public static void main(String[] args) throws Exception {//创建集合ArrayList<Integer> list = new ArrayList<>();//添加数据list.add(10);list.add(20);list.add(30);//输出集合System.out.println(list);//利用反射,在list中添加一个String数据Class<? extends ArrayList> lc = list.getClass();Method ad = lc.getMethod("add", Object.class);ad.invoke(list,"hello");//输出添加String数据后的集合System.out.println(list);}
}
运行结果:
[10, 20, 30]
[10, 20, 30, hello]
反射练习-运行配置文件指定内容
通过配置文件运行类中的方法
//老师类
public class Teacher {public void teach(){System.out.println("为师教你做人");}
}
//学生类
public class Student1 {public void study(){System.out.println("学生喜读春秋");}
}
#配置文件
className=com.fanshe.Teacher
methodName=teach
//测试类
public class Demo6 {public static void main(String[] args) throws Exception {//学生Student1 stu = new Student1();stu.study();//老师Teacher tea = new Teacher();tea.teach();System.out.println("-----配置文件实现操作-----------");//加载数据Properties pro = new Properties();FileReader fr = new FileReader("idea_test\\class.txt");pro.load(fr);fr.close();//获取配置文件中的内容String className = pro.getProperty("className");String methodName = pro.getProperty("methodName");//通过反射来使用Class<?> c = Class.forName(className);//根据无参构造方法,创建实体类对象Object obj = c.getConstructor().newInstance();//获取单个成员方法Method dm = c.getDeclaredMethod(methodName);//取消访问权限dm.setAccessible(true);//调用方法dm.invoke(obj);}
}
运行结果:
学生喜读春秋
为师教你做人
-----配置文件实现操作-----------
为师教你做人
相关文章:
Java-反射
反射概述 Java反射机制: 是指在运行时去获取一个类的变量和方法信息。然后通过获取的信息来创建对象,调用方法的一种机制。由于这种<动态性>,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍…...
构造agent类型的内存马(内存马系列篇十三)
写在前面 前面我们对JAVA中的Agent技术进行了简单的学习,学习前面的Agent技术是为了给这篇Agent内存马的实现做出铺垫,接下来我们就来看看Agent内存马的实现。 这是内存马系列篇的第十三篇了。 环境搭建 我这里就使用Springboot来搭建一个简单的漏洞…...
JavaEE简单示例——<select>中的查询参数传递和结果集封装自动映射关系
简单介绍: 在之前我们在讲SQL映射文件中的映射查询语句的<select>标签的时候,对其中的四个常用属性的讲解并不是那么的透彻,今天就来详细的解释<select>的四个常用属性的具体含义以及<select>标签在进行查询的时候查询参数…...
信息安全圈都在谈论CISP,CISSP,这两者有什么区别呢?
CISP 和 CISSP 都是信息安全认证资格考试,但是它们之间有一些区别。 CISP(Certified Information Security Professional)认证考试是由国际信息系统安全认证联盟(ISC)所开发和管理的,主要考核信息安全专业人员在保障企…...
浅谈Redisson实现分布式锁的原理
1.Redisson简介 Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,我没有说“最好”)的编程语言之一。虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java…...
UVM实战(张强)-- UVM中的寄存器模型
目录一.整体的设计结构图二.各个组件代码详解2.1 DUT2.2 bus_driver2.3 bus_sequencer2.4 bus_monitor2.5 bus_agent2.6 bus_transaction2.7 bus_if2.8 my_if2.9 my_transaction2.10 my_sequencer2.11 my_driver2.12 my_monitor2.13 my_agent2.14 my_scoreboard2.15 my_env2.16…...
什么是 CSAT?这份客户满意度流程指南请查收
什么是 CSAT?如何计算我的客户满意度分数?大中型公司应该熟悉这些术语。以下文章旨在教您有关客户满意度流程的所有内容 - 基本的CSAT概念、创建CSAT调查的好处、如何创建CSAT调查。配图来源: SaleSmartly(ss客服) 一、什么是 CSAT࿱…...
AD域备份和恢复工具
Microsoft的本地Active Directory备份和恢复功能不适用于对象级备份和属性级还原。使用RecoveryManager Plus,您不仅可以备份和还原所有AD对象,还可以备份和还原其他基本AD元素,例如架构属性,组成员身份信息和Exchange属性。此外&…...
老学长的浙大MPA现场复试经验分享
作为一名在浙大MPA项目已经毕业的考生来说,很荣幸受到杭州达立易考周老师的邀请,给大家分享下我的复试经验,因为听周老师说是这几年浙大MPA因疫情情况,已经连续几年都是线上个人复试了,而今年疫情社会面较为平稳的情况…...
制作证书链并进行验证
生成自签名的根证书: openssl req -x509 -newkey rsa -outform PEM -out tls-rootca.pem -keyform PEM -keyout tls-rootca.key.pem -days 35600 -nodes -subj “/C=cn/O=mycomp/OU=mygroup/CN=rootca” 生成中间证书 1.生成csr和key文件 openssl req -newkey rsa:2048 -outf…...
基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法应用
基于卫星或无人机平台的多光谱数据在地质、土壤调查和农业等应用领域发挥了重要作用,在地质应用方面,综合Aster的短波红外波段、landsat热红外波段等多光谱数据,可以通过不同的多光谱数据组合,协同用于矿物信息有效提取。此外&…...
初识 git--本地仓库
目录:一,基础步骤:1,安装2,配置3,检查配置4,创建仓库 - repository5,查看工作区的文件状态6,如果显示乱码的解决方式git status 显示乱码终端乱码7,添加工作区…...
Redis学习之持久化(六)
这里写目录标题一、持久化简介1.1 持久化1.2 Redis持久化的两种形式二、RDB2.1 RDB概念2.2 save指令手动执行一次保存配置相关参数2.3 bgsave指令2.4 save配置自动执行2.5 RDB三种启动方式对比三、AOF3.1 AOF概念3.2 AOF执行策略3.3 AOF重写四、RDB和AOF区别2.1 RDB与AOF对比&a…...
C++11 之 auto decltype
文章目录autodecltypesauto 和 decltype 的配合—返回值类型后置关于 c11 新特性,最先提到的肯定是类型推导,c11 引入了 auto 和 decltype 关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。…...
论文笔记:How transferable are features in deep neural networks? 2014年NIP文章
文章目录一、背景介绍二、方法介绍三、实验论证四、结论五、感想参考文献一、背景介绍 1.问题介绍: 许多在自然图像上训练的深度神经网络都表现出一个奇怪的共同现象:在第一层,它们学习类似于Gabor过滤器和color blobs的特征。这样的第一层特…...
python基于flask共享单车系统vue
可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2. 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行…...
C++11 之模板改进
模板的右尖括号 在 c98/03 的泛型编程中,模板实例化有一个很烦琐的地方,那就是连续两个右尖括号(>>)会被编译器解释成右移操作符,而不是模板参数表的结束,所以需要中间加个空格进行分割,…...
Linux - POSIX信号量,基于环形队列的生产者消费者模型
信号量在Linux下,POSIX信号量是一种线程同步机制,用于控制多个线程之间的访问顺序。POSIX信号量可以用于实现线程之间的互斥或者同步。在之前的阻塞队列生产者消费者模型中,阻塞队列是一个共享资源,不管是生产者还是消费者&#x…...
学习Flask之七、大型应用架构
学习Flask之七、大型应用架构 尽管存放在单一脚本的小型网络应用很方便,但是这种应用不能很好的放大。随着应用变得复杂,维护一个大的源文件会出现问题。不像别的网络应用,Flask没有强制的大型项目组织结构。构建应用的方法完全留给开发者。…...
CentOS9下编译FFMPEG源码
克隆...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
