【Java】Java类动态替换Class
Java类动态替换Class
通过Java的Class对象,可以实现动态替换Class。
预习几个知识点
getClassLoader
Java提供的ClassLoader可用于动态加载的Java类,可以通过多种形式获取ClassLoader。比如通过Class类获取
// 通过Class获取
ClassLoader classLoader = LinduoClass.class.getClassLoader();
利用ClassLoader,传入ClassName就可以加载类
ClassLoader classLoader = LinduoClass.class.getClassLoader();
Class<?> myClass = classLoader.loadClass("com.linduo.test.TestClass");
现在可以把Class加载出来。要创建类对象的话,需要知道Class的构造函数,以及构造函数的各个参数。
getDeclaredConstructors
Java.lang.Class类提供了getDeclaredConstructors。通过这个方法,可以获取类中所有声明的构造函数。
ClassLoader classLoader = LinduoClass.class.getClassLoader();
Class<?> myClass = classLoader.loadClass("com.linduo.test.TestClass");
// 获取所有构造函数
Constructor<?>[] methods= myClass.getDeclaredConstructors();
getParameterTypes
Method类型,提供了getParameterTypes方法,它用于获取方法的参数类型(Constructor也是方法)
ClassLoader classLoader = LinduoClass.class.getClassLoader();
Class<?> myClass = classLoader.loadClass("com.linduo.test.TestClass");
// 获取所有构造函数
Constructor<?>[] methods= myClass.getDeclaredConstructors();
// 获取构造函数的参数类型
for (Constructor<T> method : methods) { // 获取每个构造函数的参数类型Class<?>[] paramTypes = method.getParameterTypes();
}
Method类提供的newInstance,可以用于创建并返回指定类的实例。
// 可变参数,表示要传递给构造函数的参数列表
public Object newInstance(Object... initargs)
动态替换Class对象
基于上面的几个方法,可以实现动态替换Class对象。比如,FunctionA和FunctionB,同时继承了FunctionBase。可以在代码中,利用上面的方式,将FunctionA动态替换为FunctionB。
class FunctionBase
{plublic FunctionBase(int a, int b) {}
}class FunctionA extends FunctionBase
{plublic FunctionA (int a, int b) {super(a, b)}
}class FunctionB extends FunctionBase
{plublic FunctionA (int a, int b) {super(a, b)}
}// 某处代码中,将A替换为B。
int arg1 = 1;
int arg2 = 2;
FunctionBase myFunction = replaceToB(FunctionA.class, arg1 , arg2);
上述代码中,可以将FunctionA动态替换为FunctionB。Linduo.replaceToB的具体实现如下。
public boolean canReplace(params, classParams) {// 长度不等if (params.length != classParams.length) {return false;}// 判断参数类型是否相同int count = 0;for (int i = 0; i < params.length; i++) {if (params[i] == classParams[i]) {count++;}}if (count == params.length) {// 相等return true;} return false;
}public FunctionBase replaceToB(Class<?> classA, Object... args) {String name;String nameA = classA.getName();if (nameA != "com.linduo.FunctionA") {return null;} else {// 如果是FunctionA类,则使用FunctionB代替。name = FunctionB.class.getName();}// 加载FunctionB类Class cl= Linduo.class.getClassLoader().loadClass(name);// 获取B类的方法Constructor<FunctionBase>[] methods = cl.getDeclaredConstructors();// 构造参数列表Class<?>[] params = new Class[args.length];for (int i = 0; i < args.length; i++) {params[i] = args[i].getClass();}for (Constructor<T> method : methods) {// 获取构造函数的参数列表Class<?>[] classParams = method.getParameterTypes();if (canReplace(params, classParams)) {// 如果参数相等,设置setAccessible为True,用来访问构造函数method.setAccessible(true);return method.newInstance(args);}}return null;
}}
相关文章:
【Java】Java类动态替换Class
Java类动态替换Class 通过Java的Class对象,可以实现动态替换Class。 预习几个知识点 getClassLoader Java提供的ClassLoader可用于动态加载的Java类,可以通过多种形式获取ClassLoader。比如通过Class类获取 // 通过Class获取 ClassLoader classLoade…...
【驱动系列】C#获取电脑硬件显卡核心代号信息
欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《驱动系列》文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点…...
AutoGen实战应用(二):多代理协作(Multi-Agent Collaboration)
AutoGen是微软推出的一个全新工具,它用来帮助开发者创建基于大语言模型(LLM)的复杂应用程序. AutoGen能让LLM在复杂工作流程启用多个角色代理来共同协作完成人类提出的任务。在我之前的一篇博客: AutoGen实战应用(一):代码生成、执行和调试 中我们通过一…...
c++文件操作 (1) -- 读写文件
目录 为什么使用文件操作 文件输入流和输出流 -- 相对于内存而言 文件操作 1. 文件操作常用类以及头文件 2. 文件输入流(写文件操作) 1. 写文本文件 1)文件操作是使用对象来实现的 2)文件输出 3)打开文件 open函数 ÿ…...
PHP操作Mysql记录数多引发的空白错误
1 错误由来 php操作三张表,一张表有近四十万条记录,另外两张表记录数在三万左右,三张表又关联。应用左连接left join。 $qLStr "select pu.pd_no, pu.common_name, pu.purchase_cost, pu.medication_area, pu.total_dosage, pu.contro…...
transformer和vit学习笔记
以下记录自己对transformer的学习笔记,可能自己看得懂【久了自己也忘了看不懂】,别人看起来有点乱。以后再优化文档~ 小伙伴请直接去看学习资源: Transformer的理解T-1_哔哩哔哩_bilibili 首先,时序处理:一些模型的出…...
人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示)
人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示) FaceNet的简介Facenet的实现思路训练部分 FaceNet的简介 Facenet的实现思路 import torch.nn as nndef conv_bn(inp, oup, stride 1):return nn.Sequential(nn.Conv2d(inp, oup, 3, stride…...
Python tkinter (6) Listbox
Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…...
优雅的python(二)
🌈个人主页:小田爱学编程 🔥 系列专栏:c语言从基础到进阶 🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x…...
Git安装详细步骤
目录 1、双击安装包,点击NEXT编辑 2、更改安装路径,点击NEXT 3、选择安装组件 4、选择开始菜单页 5、选择Git文件默认的编辑器 6、调整PATH环境 7、选择HTTPS后端传输 8、配置行尾符号转换 9、配置终端模拟器与Git Bash一起使用 10、配置额外…...
首发:2024全球DAO组织发展研究
作者,张群(专注DAO及区块链应用研究,赛联区块链教育首席讲师,工信部赛迪特邀资深专家,CSDN认证业界专家,微软认证专家,多家企业区块链产品顾问) DAO(去中心化自治组织&am…...
【大数据】详解 Flink 中的 WaterMark
详解 Flink 中的 WaterMark 1.基础概念1.1 流处理1.2 乱序1.3 窗口及其生命周期1.4 Keyed vs Non-Keyed1.5 Flink 中的时间 2.Watermark2.1 案例一2.2 案例二2.3 如何设置最大乱序时间2.4 延迟数据重定向 3.在 DDL 中的定义3.1 事件时间3.2 处理时间 1.基础概念 1.1 流处理 流…...
【数据结构1-2】二叉树
树形结构不仅能表示数据间的指向关系,还能表示出数据的层次关系,而有很明显的递归性质。因此,我们可以利用树的性质解决更多种类的问题。 但是在平常的使用中,我们并不需要使用这么复杂的结构,只需要建立一个包含int r…...
ajax点击搜索返回所需数据
html 中body设置(css设置跟进自身需求) <p idsearch_head>学生信息查询表</p> <div id"div_1"> <div class"search_div"> <div class"search_div_item"> …...
Redis6基础知识梳理~
初识NOSQL: NOSQL是为了解决性能问题而产生的技术,在最初,我们都是使用单体服务器架构,如下所示: 随着用户访问量大幅度提升,同时产生了大量的用户数据,单体服务器架构面对着巨大的压力 NOSQL解…...
在Python中如何使用集合进行元素操作
目录 1. 创建集合 2. 添加或删除元素 3. 集合运算 4. 其他集合操作 总结 在Python中,集合(set)是一种基本的数据结构,用于存储无序且唯一的元素。这意味着集合中的每个元素都是独一无二的,且集合不保持任何元素的…...
2024年阿里云幻兽帕鲁Palworld游戏服务器优惠价格表
自建幻兽帕鲁服务器租用价格表,2024阿里云推出专属幻兽帕鲁Palworld游戏优惠服务器,配置分为4核16G和4核32G服务器,4核16G配置32.25元/1个月、10M带宽66.30元/1个月、4核32G配置113.24元/1个月,4核32G配置3个月339.72元。ECS云服务…...
Atlassian Confluence Data Center and Server 权限提升漏洞复现(CVE-2023-22515)
0x01 产品简介 Atlassian Confluence是一款由Atlassian开发的企业团队协作和知识管理软件,提供了一个集中化的平台,用于创建、组织和共享团队的文档、知识库、项目计划和协作内容。是面向大型企业和组织的高可用性、可扩展性和高性能版本。 0x02 漏洞概述 Atlassian Confl…...
打开 IOS开发者模式
前言 需要 1、辅助设备:苹果电脑; 2、辅助应用:Xcode; 3、准备工作:苹果手机 使用数据线连接 苹果电脑; 当前系统版本 IOS 17.3 通过Xcode激活 两指同时点击 Xcode 显示选择,Open Develop…...
【C语言刷题系列】交换两个变量的三种方式
文章目录 1.使用临时变量(推荐) 2.相加和相减的方式(值较大时可能丢失数据) 3.按位异或运算 本文所属专栏C语言刷题_倔强的石头106的博客-CSDN博客 两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
