在使用asm包进行动态类加载的时候的打包问题

如图所示,开发时使用的jdk包下面的asm包,在进行打包时提示asm包不存在,打包方式使用如下:

目前提供两种解决方案:
1:修改打包方式,将jdk的包也打进去:
<plugin> |

方案2:更换asm依赖,
在pom中引入如下内容
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>9.4</version>
</dependency>
在动态类加载中将
import jdk.internal.org.objectweb.asm.*; 替换为 import org.objectweb.asm.*;
动态类class加载完整类:
package huilong.cloud.examCertificate.util;
import cn.afterturn.easypoi.excel.annotation.Excel;
import org.objectweb.asm.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
/**
* @Author: zzy
* @Date: 2024/10/25/10:06
* @Description:
*/
public class DynamicClassCreateUtil extends ClassLoader{
public static Class<?> createClass(List<String> columnTitles){
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
String packageName = "huilong.cloud.examCertificate.util"; // 指定包名
String className = "DynamicClass";
String fullClasName = packageName + "." + className;
String internalClassName = fullClasName.replace('.', '/');
// String iExcelDataModelName = "cn/afterturn/easypoi/handler/inter/IExcelDataModel";
// String iExcelModelName = "cn/afterturn/easypoi/handler/inter/IExcelModel";
// 定义类
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, internalClassName, null, "java/lang/Object", new String[]{});
// cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, internalClassName, null, "java/lang/Object", new String[]{iExcelDataModelName, iExcelModelName});
// 添加构造器
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
// 添加字段
for (int i = 0; i < columnTitles.size(); i++) {
String header = columnTitles.get(i);
mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "get" + capitalize(header), "()Ljava/lang/String;", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, internalClassName, header, "Ljava/lang/String;");
mv.visitInsn(Opcodes.ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "set" + capitalize(header), "(Ljava/lang/String;)V", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.PUTFIELD, internalClassName, header, "Ljava/lang/String;");
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(1, 2);
mv.visitEnd();
// 定义一个带有@Excel注解的字段
String fieldDesc = Type.getDescriptor(String.class); // String类型的描述符
String annotationDesc = Type.getDescriptor(Excel.class);
// 访问字段
FieldVisitor fv = cw.visitField(Opcodes.ACC_PUBLIC, header, fieldDesc, null, null);
// 访问注解
AnnotationVisitor av = fv.visitAnnotation(annotationDesc, true);
av.visit("name", header); // 设置注解属性的值
// 结束注解的访问
av.visitEnd();
// 结束字段的访问
fv.visitEnd();
}
mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "setRowNum", "(I)V", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ILOAD, 1);
mv.visitVarInsn(Opcodes.ISTORE, 2);
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(1, 3);
mv.visitEnd();
// 结束类定义
cw.visitEnd();
byte[] byteArray = cw.toByteArray();
// 创建自定义类加载器
try {
// 假设这是你的类字节码
ByteArrayClassLoader classLoader = new ByteArrayClassLoader(byteArray);
return classLoader.loadClass(fullClasName);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String capitalize(String str) {
if (str == null || str.isEmpty()) {
return str;
}
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
public static HashMap<String, String> objectToMap(Object obj) {
if (obj == null) {
throw new IllegalArgumentException("Object cannot be null");
}
HashMap<String, String> map = new HashMap<>();
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
Object value = field.get(obj);
map.put(field.getName(), value == null ? "" : value.toString());
} catch (IllegalAccessException e) {
throw new RuntimeException("字段转换失败 " + field.getName(), e);
}
}
return map;
}
}
在使用asm包进行动态类加载的时候的打包问题的更多相关文章
- spring-core 中 asm 包的作用
asm包中主要有以下这些类 其中, AnnotationVisitor类:是一个抽象类,定义在解析注解时会触发的事件,如解析到一个基本值类型的注解.enum值类型的注解.Array值类型的注解.注解值 ...
- 怎样在OTN站点高速找到asm包并下载 (Oracle RAC)
怎样在OTN站点高速找到asm包并下载 ***********************************************声明******************************* ...
- 使用Oracle的DBMS_SQL包执行动态SQL语句
引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle ...
- 将JAR包反编译,修改后重新打包(转)
将JAR包反编译,修改后重新打包(转) 在学习和开发JAVA项目中,我们经常会用到第三方提供的一些jar.使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间.有的第三方工具,提供具体的 ...
- Spring Boot 打war包并利用docBase指定根目录为打包的工程
指定根目录有两种方式 1:直接将打的war包名称定义为ROOT 2:利用docBase 比如笔者war包名为xibu.war,将该war包丢到/Users/archerlj/Library/apach ...
- vue 动态ip配置,避免重复打包
目前比较流行的打包大都是在vue.config.js配置代理,然后在根目录新建.env.xxx文件配置正式环境,测试环境,开发环境等用于打包时配置不同的访问地址,作为一名随波逐流的前端开发,我也是这么 ...
- Java中Asm包有什么用?
ASM能做什么 我们都知道,一般情况下,Class文件是通过javac编译器产生的,然后通过类加载器加载到虚拟机内,再通过执行引擎去执行. 现在我们可以通过ASM的API直接生成符合Java虚拟机规范 ...
- java提供类与cglib包实现动态代理
终于有点空余时间,决定把之前学习的知识点整理一下,备以后复习. 动态代理有三角色:抽象角色,代理角色,真是角色. 第一个记录下java提供的动态代理.即使用Proxy类和InvocationHande ...
- 组件化框架设计之apt编译时期自动生成代码&动态类加载(二)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从以下两个内容来介绍组件化框架设计: apt编译时 ...
- SSIS包配置动态配置数据库连接
动态连接数据库便于维护 用SSIS包配置实现 1.控制流页签 - 右键 - 包配置 2.配置xml文件 3.指定连接属性:ServerName.UserName.Password 测试: 1.配置错误 ...
随机推荐
- 洛谷P1209修理牛棚 Barn Repair
[USACO1.3] 修理牛棚 Barn Repair 题目描述 在一个月黑风高的暴风雨夜,Farmer John 的牛棚的屋顶.门被吹飞了 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一 ...
- c#12 实验特性Interceptor如何使用的一个简单但完整的示例
一直有很多转载dotnet对Interceptor说明文档的,但鲜有说明Interceptor如何使用的,这里写一篇简单示例来展示一下 c# 12 实验特性Interceptor 是什么? 官方解释如 ...
- [VS Code扩展]写一个代码片段管理插件(二):功能实现
@ 目录 创建和插入代码片段 代码片段列表 代码片段预览 代码片段编辑 自定义映射 默认映射 自动完成 项目地址 创建和插入代码片段 VS Code扩展提供了数据存储,其中globalState是使用 ...
- 初三年后集训测试T3---树上的宝藏
初三年后集训测试 $T 3 $ 树上的宝藏 $$HZOI$$ ·题意 · \(Description\) 蒜头君有一棵 \(n\) 个节点的树(即 \(n\) 个节点, \(n−1\) 条边的无向连通 ...
- OpenTelemetry 实战:从零实现应用指标监控
前言 在上一篇文章:OpenTelemetry 实战:从零实现分布式链路追踪讲解了链路相关的实战,本次我们继续跟进如何使用 OpenTelemetry 集成 metrics 监控. 建议对指标监控不太 ...
- 【YashanDB知识库】23.1.3.101版本创建物化视图coredump
[标题]23.1.3.101版本创建物化视图coredump [问题分类]数据库错误 [关键词]YashanDB, 物化视图, coredump, dblink [问题描述]在23.1.3.101版本 ...
- 13 Python面向对象编程:装饰器
本篇是 Python 系列教程第 13 篇,更多内容敬请访问我的 Python 合集 Python 装饰器是一种强大的工具,用于修改或增强函数或方法的行为,而无需更改其源代码.装饰器本质上是一个接收函 ...
- 【LLM训练系列】从零开始训练大模型之Phi2-mini-Chinese项目解读
一.前言 本文主要是在复现和实践Phi2-mini-Chinese后,简要分析下Phi2-mini-Chinese这个项目,做一个学习实战总结. 原文发布于知乎:https://zhuanlan.zh ...
- 合合信息推出国央企智能文档处理解决方案,AI赋能信创国产化
信息时代,数字化转型已成为推动经济高质量发展的关键力量.国央企是国民经济的重要支柱,其数字化转型进程关乎着自身与产业链上下游企业的共同发展.文档的智能化处理可有效提升信息流转的效率.促进知识的沉淀与传 ...
- C# – 冷知识 (新手)
替 Action/Func Parameter 设置名字 public static void MatchBracket(string value, string bracket, Action< ...