如图所示,开发时使用的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. 社区6月月报 | Apache DolphinScheduler重要修复和优化记录

    各位热爱Apache DolphinScheduler的小伙伴们,社区6月月报更新啦!这里将记录Apache DolphinScheduler社区每月的重要更新,欢迎关注. 月度Merge Stars ...

  2. 让你的C程序,可以自动更新版本信息

    一.软件管理 稍微上点规模的软件开发往往周期都非常长, 中间会产生很多临时版本, 这些临时版本往往会有各种各样的bug, 由于项目参与的人员众多.水平参差不齐, 软件分支众多.功能复杂, 经常会有各种 ...

  3. k8s获取集群内所有在使用镜像

    kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' ' ' | sort ...

  4. OpenPCDet复现过程记录

    0.前言 OpenPCDet项目之前我就复现过,一个很优秀的项目,这几天又需要用到这个项目,再次复现遇到了不少问题,特此记录复现的流程 1.环境准备 1.1.前置条件 以下是我安装的版本 CUDA 1 ...

  5. Win32 SDK(四)Edit控件用法

    Win32 SDK(四)Edit控件用法 1获得控件句柄 HWND hEdit2 = ::GetDlgItem(hWnd, IDC_EDIT2); WINUSERAPI HWND WINAPI Get ...

  6. GNU make-Makefile文件简介

    Makefile简介 Makefile是一种特殊格式的文件,被make工具使用来管理软件的构建过程.Makefile定义了一组规则和依赖关系,告诉make如何编译和链接程序. Makefile语句 T ...

  7. 搜索组件优化 - Command ⌘K

    前言: DevNow 项目中我们使用了 DocSearch 来实现搜索功能,但是由于有以下的限制: 您的网站必须是技术文档或技术博客. 您必须是网站的所有者,或者至少具有更新其内容的权限 您的网站必须 ...

  8. 为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义?

    为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义? 类的静态成员变量需要在源文件中进行定义,以便在链接阶段能够正确地分配内存并为其分配地址. 当你在类的头文件中声明一个静态成员变量时,这只 ...

  9. NOIP 考前板子复习

    点双 注意两个点,特判单点,是 son = 0 且 fa = 0,因为自环,还有弹栈弹到儿子节点处,因为点双不一定由割点弹出. code void dfs(int u, int la) { int s ...

  10. vue3 如何获取 dom

    1. 通过 ref     1. 在 html 标签上指定 ref 属性     2. 在 setup 中定义并返回.注意:标签上的 ref 属性名需要跟 setup 中的对应 <h1 ref= ...