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

目前提供两种解决方案:

1:修改打包方式,将jdk的包也打进去:

<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<verbose />
<!-- 将jdk的依赖jar打入项目中,这样项目中使用的jdk的依赖就尅正常使用 -->
<bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar;${java.home}/lib/jsse.jar</bootclasspath>
</compilerArguments>
</configuration>
</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包进行动态类加载的时候的打包问题的更多相关文章

  1. spring-core 中 asm 包的作用

    asm包中主要有以下这些类 其中, AnnotationVisitor类:是一个抽象类,定义在解析注解时会触发的事件,如解析到一个基本值类型的注解.enum值类型的注解.Array值类型的注解.注解值 ...

  2. 怎样在OTN站点高速找到asm包并下载 (Oracle RAC)

    怎样在OTN站点高速找到asm包并下载 ***********************************************声明******************************* ...

  3. 使用Oracle的DBMS_SQL包执行动态SQL语句

    引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle ...

  4. 将JAR包反编译,修改后重新打包(转)

     将JAR包反编译,修改后重新打包(转)   在学习和开发JAVA项目中,我们经常会用到第三方提供的一些jar.使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间.有的第三方工具,提供具体的 ...

  5. Spring Boot 打war包并利用docBase指定根目录为打包的工程

    指定根目录有两种方式 1:直接将打的war包名称定义为ROOT 2:利用docBase 比如笔者war包名为xibu.war,将该war包丢到/Users/archerlj/Library/apach ...

  6. vue 动态ip配置,避免重复打包

    目前比较流行的打包大都是在vue.config.js配置代理,然后在根目录新建.env.xxx文件配置正式环境,测试环境,开发环境等用于打包时配置不同的访问地址,作为一名随波逐流的前端开发,我也是这么 ...

  7. Java中Asm包有什么用?

    ASM能做什么 我们都知道,一般情况下,Class文件是通过javac编译器产生的,然后通过类加载器加载到虚拟机内,再通过执行引擎去执行. 现在我们可以通过ASM的API直接生成符合Java虚拟机规范 ...

  8. java提供类与cglib包实现动态代理

    终于有点空余时间,决定把之前学习的知识点整理一下,备以后复习. 动态代理有三角色:抽象角色,代理角色,真是角色. 第一个记录下java提供的动态代理.即使用Proxy类和InvocationHande ...

  9. 组件化框架设计之apt编译时期自动生成代码&动态类加载(二)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从以下两个内容来介绍组件化框架设计: apt编译时 ...

  10. SSIS包配置动态配置数据库连接

    动态连接数据库便于维护 用SSIS包配置实现 1.控制流页签 - 右键 - 包配置 2.配置xml文件 3.指定连接属性:ServerName.UserName.Password 测试: 1.配置错误 ...

随机推荐

  1. Apache DolphinScheduler数仓任务管理规范

    前言: 大数据领域对多种任务都有调度需求,以离线数仓的任务应用最多,许多团队在调研开源产品后,选择Apache DolphinScheduler(以下简称DS)作为调度场景的技术选型.得益于DS优秀的 ...

  2. keycloak~关于社区登录的过程说明

    keycloak将第三方登录(社区登录)进行了封装,大体主要会经历以下三个过程: 打开社区认证页面,输入账号密码或者扫码,完成社区上的认证 由社区进行302重定向,回到keycloak页面 keycl ...

  3. 性能测试面试题大曝光,让你如何迅速拿下 offer!

    性能测试面试题精选 1. 以前做过性能测试么?请结合例子具体说明性能测试的流程 面试考察点:性能测试的流程 首选做性能测试的需求分析,明确性能测试的目标.范围.场景和性能指标(如响应时间.吞吐量.并发 ...

  4. 为了落地DDD,我是这样“PUA”大家的

    本文书接上回<先有鸡还是先有蛋?这是领域驱动设计落地最大的困局> https://mp.weixin.qq.com/s/lzAZXgchCg_VyLmyo2N18Q   故事背景 2023 ...

  5. logback日志级别动态切换的四种方案 荐

    生产环境中经常有需要动态修改日志级别. 现在就介绍几种方案 方案一:开启logback的自动扫描更新 配置如下 <?xml version="1.0" encoding=&q ...

  6. flink + iceberg 快速搭建指南

    flink + iceberg 快速搭建 the environment includes: minio iceberg flink Centos 更换 tencent 的yum源 备份系统旧配置文件 ...

  7. Go 互斥锁 Mutex 源码分析(二)

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 在 Go 互斥锁 Mutex 源码分析(一) 一文中分析了互斥锁的结构和基本的抢占互斥锁的场景.在学习锁的过程中,看的不少文章是基于锁的状态解释 ...

  8. elementui 修改合计行样式

    <style scoped> /deep/.el-table .el-table__footer-wrapper .cell { text-align: right } </styl ...

  9. WPF 实现一个吃豆豆的Loading加载动画

    运行的效果如下 先引入一下我们需要的库 在nuget上面搜一下"expression.Drawing",安装一下这个包 我们再创建一个Window,引入一下这个包的命名空间 我们设 ...

  10. MyBatisPlus——标准数据层开发

    标准数据层开发 标准数据层CRUD功能 lombok 一个java类库,提供了一组注解,简化POJO实体类开发    常用注解@Data    为当前实体类在编译期设置对应的get/set方法,无参/ ...