【问题标题】:Java Reflection dynamic path: ClassNotFoundExceptionJava 反射动态路径:ClassNotFoundException
【发布时间】:2018-11-13 22:31:14
【问题描述】:

我正在尝试使用 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)

编辑*: 这是我使用 IntelliJ 的 Maven 项目文件的屏幕截图:

Screenshot

我做错了什么?

【问题讨论】:

  • 请发布异常堆栈跟踪。

标签: java string exception reflection path


【解决方案1】:

在您的堆栈跟踪中似乎有很多尾随空格。也许这样的事情会有所帮助:

//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+","")));

【讨论】:

    【解决方案2】:

    您的堆栈跟踪显示为:java.lang.ClassNotFoundException: foo/bar/baz/turn/IncDecValue

    我已迅速尝试重现您的问题,我收到的异常为 java.lang.ClassNotFoundException: foo.bar.baz.turn.IncDecValue

    显示斜线而不是点可能表示您的类位于目录而不是包中。或者至少在异常发生时是这样的。

    【讨论】:

    • 我也注意到了,但我不知道如何解决。如果有用,我添加了我的项目树的屏幕截图
    • 也许这个链接对你有帮助?我看到您正在通过 IntelliJ 运行 JUnit5 测试,这里也提到了这种情况。你的 pom 中有所有必要的 JUnit5 依赖项吗?以前 JUnit 版本的任何不必要的依赖项怎么办?你的测试课是什么样子的? intellij-support.jetbrains.com/hc/en-us/community/posts/…
    • 您链接我的帖子中引用的依赖项已经在我的项目中。 JUnit 版本也只有一个,是 5.1.0。关于我的测试,是一个非常简单的测试,我声明了我需要调用 Java Reflection 方法的所有变量,然后调用它。如果有用,我可以发布测试代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多