【问题标题】:Java cannot find the class file, while javap canJava找不到类文件,而javap可以
【发布时间】:2015-07-13 20:24:53
【问题描述】:

我使用Java ASM library 编译了一个类(称为Test.class)。我决定尝试使用“java”命令运行该类,以确保我已正确编译该类。

但是,当我执行此操作时,我收到“无法找到或加载主类测试”消息。我认为这很奇怪,因为该类位于当前工作目录中(我也尝试将“。”作为类路径传递,但无济于事)。然后我尝试用“javap”对其进行分解,效果很好,这很奇怪,因为如果 javap 可以找到类文件,那么 java 肯定也应该能够吗?

这是我的命令行输入和输出:

$ javap -c 测试

Compiled from "Test.ash" 
public class Test
{   
  public Test();
    Code:
     0: aload_0
     1: invokespecial #9 // Method "java.lang.Object"."<init>":()V
     4: return

  public static void main(java.lang.String[]);
    Code:
     0: return
}

$java 测试

错误:无法找到或加载主类 Test

$ java Test.class

错误:无法找到或加载主类 Test

$ java -cp 。测试

错误:无法找到或加载主类 Test

$ java -cp 。测试类

错误:无法找到或加载主类 Test

可能出了什么问题?我可能错误地编译了这个类,但是 javap 肯定会像 java 一样抱怨,并且 javap 输出看起来是正确的。

【问题讨论】:

  • 很可能它可以找到它,但它无法加载它。 Test.ash 中有什么?看起来你调用对象构造函数是错误的。
  • @DiegoBasch 实际上这点很好,我应该在调用构造函数之前加载实例,我会尝试一下。
  • @DiegoBasch 我添加了 aload_0 操作码,但它仍然无法加载。我还在 javac 生成的类上使用了 javap,但是这些类看起来是一样的。我在“Test.ash”中有一些我自己语言的代码,我正在编译为字节码。

标签: java java-bytecode-asm javap


【解决方案1】:

我发现了问题,我没有用斜杠替换类的超类限定名中的点。

因此该类具有“java.lang.Object”的超类,而不是“java/lang/Object”,这是必需的。

【讨论】:

  • 您是否正在制作基于 JVM 的自定义编程语言?
  • @Clashsoft 我确实是 :) 它叫做 Ash。我在 Github 上看到了你的!它看起来很酷,尤其是头文件。
  • 您是否也看到了“贡献者”页面?因为相信我,很多工作等着你:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
相关资源
最近更新 更多