You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java反射动态创建SubClass实例及ClassNotFoundException问题排查

问题描述

我有一个HoldingClass类,其成员属性均为SubClass类型,仅变量名称不同。该类会接收包含idNo、文本信息以及identifier的JSON对象,其中identifier用于指向需要创建对应实例的SubClass属性。

整体分为三部分:

  • 包含SubClass类型属性的HoldingClass类
  • JSON数组
  • 存储identifier与SubClass属性名称映射的HashMap

相关代码与数据

HashMap映射代码

dictionary.put("blue", "two");
dictionary.put("black", "one");
dictionary.put("red", "three");
dictionary.put("green", "four");

JSON数组示例

[{
      "identifier": "blue",
      "invoId": 1,
      "questNo": 1,
      "seqId": "1a",
      "answerText": 1
  }, {
      "identifier": "red",
      "invoId": 1,
      "questNo": 2,
      "seqId": "2a",
      "answerText": 0
  }, {
      "identifier": "green",
      "invoId": 1,
      "questNo": 3,
      "seqId": "3a",
      "answerText": 1
  }, {
      "identifier": "black",
      "invoId": 1,
      "questNo": 4,
      "seqId": "4a"
  }
]

JSON数组中的颜色标识通过HashMap映射为数字,该数字对应HoldingClass中要构建的SubClass属性名称。

HoldingClass代码

public class HoldingClass {
    private SubClass one;
    private SubClass two;
    private SubClass three;
    private SubClass four;
}

SubClass代码

public class SubClass<T> {
    private String identifier;
    private String seqId;
    private int questNo;
    boolean answerText;
    private int invoId = 1;
}

当前问题与尝试

我需要通过反射指向HoldingClass中的特定SubClass属性,并根据JSON数组元素的信息创建对应的SubClass实例,但多次尝试均未成功。

尝试方法1

public <T> SubClass constructClass(String className, String identifier, String seqId, int questNo, boolean answerText) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
    Class<?> clazz = Class.forName(className);
    Class parameters[] = new Class[]{String.class, Integer.class, Object.class};
    Constructor<?> constructor = String.class.getConstructor(parameters);
    return (SubClass) constructor.newInstance(parameters);
}

尝试方法2

public void HoldingClass3(String subclassType, String identifier, String seqId, int questNo, boolean answerText) {
    try {
        Class<?> clazz = Class.forName(subclassType);
        SubClass instance = (SubClass) clazz.getDeclaredConstructor(String.class, String.class, int.class, boolean.class)
                .newInstance(identifier, seqId, questNo, answerText);
        if ("one".equals(subclassType)) {
            one = instance;
        } else if ("two".equals(subclassType)) {
            two = instance;
        } else if ("three".equals(subclassType)) {
            three = instance;
        } else if ("four".equals(subclassType)) {
            four = instance;
        }
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
        e.printStackTrace();
    }
}

调用代码与错误信息

调用代码:

holdingClass.HoldingClass3("one", "hello", "hello", 1, true);

抛出的错误:

java.lang.ClassNotFoundException: one
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:496)
    at java.base/java.lang.Class.forName(Class.java:475)
    at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:391)
    at java.base/java.lang.Class.forName(Class.java:382)
    at Reflection.HoldingClass.HoldingClass3(HoldingClass.java:43)
    at com.Nicolaus.Spring.Fundamentals.SpringFundamentalsApplication.main(SpringFundamentalsApplication.java:41)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)

Process finished with exit code 0

内容的提问来源于stack exchange,提问作者AJuniorDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:15:53