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
相关产品推荐
相关产品推荐

