Я пытаюсь создать объект динамически, используя отражение Java, и когда я пытаюсь выполнить Class.forName (), он возвращает мне ClassNotFoundException, это мой код:
Class cls = Class.forName("foo.bar.baz.turn."+ nextStateName);
где nextStateName - это имя класса, который я хочу создать. Странно то, что если я попытаюсь сделать
Class cls = Class.forName("foo.bar.baz.turn.nameclass");
оно работает.
Обновлено: это StackTrace
java.lang.ClassNotFoundException: foo/bar/baz/turn/IncDecValue
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at foo.bar.baz.turn.Turn.setDynamicState(Turn.java:83)
at foo.bar.baz.turn.ChooseDice1.receiveMove(ChooseDice1.java:47)
at foo.bar.baz.turn.turn.Turn.receiveMove(Turn.java:286)
at foo.bar.baz.turntest.ToolCard1Test.TestingCard(ToolCard1Test.java:158)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:436)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170)
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:112)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:120)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:120)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:55)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
РЕДАКТИРОВАТЬ*: Это снимок экрана моих файлов проекта Maven с использованием IntelliJ:
Что я делаю неправильно?




Кажется, что в вашей трассировке стека много конечных пробелов. Может, поможет что-то вроде этого:
//removes spaces as seen here: https://stackoverflow.com/questions/5455794/removing-whitespace-from-strings-in-java
Class cls = Class.forName("foo.bar.baz.turn."+ (nextStateName.replaceAll("\\s+","")));
Ваша трассировка стека читает: java.lang.ClassNotFoundException: foo/bar/baz/turn/IncDecValue.
Я быстро попытался воспроизвести вашу проблему, и полученное мной исключение прочитало java.lang.ClassNotFoundException: foo.bar.baz.turn.IncDecValue.
Отображение косой черты вместо точек может указывать на то, что ваши классы расположены в каталогах, а не в пакетах. По крайней мере, так было, когда произошло исключение.
Я тоже это заметил, но не знаю, как это исправить. Если это может быть полезно, я добавил скриншот своего дерева проекта
Может эта ссылка вам поможет? Я вижу, что вы запускаете тест JUnit5 через IntelliJ, и такая ситуация также упоминается здесь. У вас есть все необходимые зависимости JUnit5 в вашем pom? А как насчет ненужных зависимостей предыдущих версий JUnit? Как выглядит ваш тестовый класс? intellij-support.jetbrains.com/hc/en-us/community/posts/…
Зависимости, указанные в сообщении, которое вы связали со мной, уже находятся в моем проекте. Кроме того, версия JUnit только одна - 5.1.0. Что касается моего теста, это очень простой тест, я объявляю все переменные, которые мне нужны для вызова метода Java Reflection, а затем вызываю его. Если может быть полезно, могу опубликовать тестовый код
Пожалуйста, опубликуйте трассировку стека исключений.