[alibaba/fastjson]jdk9引入的模块导致的问题:ClassNotFoundException: java.sql.Time

2025-10-28 387 views
1

fastjson版本:1.2.58 错误堆栈如下:

Exception in thread "main" java.lang.NoClassDefFoundError: java/sql/Time
    at fastjson@1.2.58/com.alibaba.fastjson.util.TypeUtils.addBaseClassMappings(TypeUtils.java:1439)
    at fastjson@1.2.58/com.alibaba.fastjson.util.TypeUtils.<clinit>(TypeUtils.java:119)
    at fastjson@1.2.58/com.alibaba.fastjson.parser.ParserConfig.<init>(ParserConfig.java:122)
    at fastjson@1.2.58/com.alibaba.fastjson.parser.ParserConfig.<init>(ParserConfig.java:188)
    at fastjson@1.2.58/com.alibaba.fastjson.parser.ParserConfig.<init>(ParserConfig.java:184)
    at fastjson@1.2.58/com.alibaba.fastjson.parser.ParserConfig.<clinit>(ParserConfig.java:94)
    at fastjson@1.2.58/com.alibaba.fastjson.JSON.parseArray(JSON.java:563)
Caused by: java.lang.ClassNotFoundException: java.sql.Time
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)

我的项目使用了jdk9之后引入的的module特性,目测是因此导致未被requires的module对反射不可见。是否有一个版本的fastjson兼容9以后的jdk?

回答

7

同样的问题+1

5

但我有一个解决方案,添加

requires java.sql;
opens <which package call JSON.parseArray> to fastjson;

在你的 module-info.java 中。

4

@RazeSoldier 提到的添加opens声明可以解决部分问题。

但是还有一种特殊情况,没法解决:

通过java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch将fastjson插入到bootstrap类加载器中,而java模块化后,bootstrap类加载器无法加载java.sql.*,此时也会报错ClassNotFoundException: java.sql.Time,添加opens声明应该没有帮助。

示例代码 ```java package com.example.instrument; import java.io.IOException; import java.lang.instrument.Instrumentation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.jar.JarFile; public class InstrumentTest { public static class ClassA { } public static void premain(java.lang.String args, Instrumentation inst) throws ClassNotFoundException, IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { String path = "/path/to/fastjson/target/fastjson-1.2.77_preview_01.jar"; inst.appendToBootstrapClassLoaderSearch(new JarFile(path)); Map map = new HashMap<>(); map.put("ClassA", new ClassA()); Class jsonClass = InstrumentTest.class.getClassLoader().loadClass("com.alibaba.fastjson.JSON"); Method toJSONStringMethod = jsonClass.getDeclaredMethod("toJSONString", Object.class); // 下一句会抛出java.lang.NoClassDefFoundError: java/sql/Timestamp String res = (String) toJSONStringMethod.invoke(null, map); System.out.println("res:::::"); System.out.println(res); } } ``` 报错: ``` $ /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin/java -javaagent:/path/to/fastjson-in-javaagent/target/java-agent-0.0.1-SNAPSHOT.jar -jar /path/to/java-agent-0.0.1-SNAPSHOT.jar Listening for transport dt_socket at address: 5005 Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513) at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525) Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at com.example.instrument.InstrumentTest.premain(InstrumentTest.java:27) ... 6 more Caused by: java.lang.NoClassDefFoundError: java/sql/Timestamp at com.alibaba.fastjson.parser.ParserConfig.initDeserializers(ParserConfig.java:409) at com.alibaba.fastjson.parser.ParserConfig.(ParserConfig.java:399) at com.alibaba.fastjson.parser.ParserConfig.(ParserConfig.java:364) at com.alibaba.fastjson.parser.ParserConfig.(ParserConfig.java:360) at com.alibaba.fastjson.parser.ParserConfig.(ParserConfig.java:175) at com.alibaba.fastjson.util.TypeUtils.buildBeanInfo(TypeUtils.java:1597) at com.alibaba.fastjson.serializer.SerializeConfig.createJavaBeanSerializer(SerializeConfig.java:119) at com.alibaba.fastjson.serializer.SerializeConfig.getObjectWriter(SerializeConfig.java:827) at com.alibaba.fastjson.serializer.SerializeConfig.getObjectWriter(SerializeConfig.java:446) at com.alibaba.fastjson.serializer.JSONSerializer.getObjectWriter(JSONSerializer.java:448) at com.alibaba.fastjson.serializer.MapSerializer.write(MapSerializer.java:254) at com.alibaba.fastjson.serializer.MapSerializer.write(MapSerializer.java:44) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:312) at com.alibaba.fastjson.JSON.toJSONString(JSON.java:800) at com.alibaba.fastjson.JSON.toJSONString(JSON.java:738) at com.alibaba.fastjson.JSON.toJSONString(JSON.java:695) ... 11 more ```