我有一些我想要反编译的.class文件.所以这就是我所做的:我总是遇到
javap -c "C:\users\Richard\workspace\pruebas\bin\ClassName"同样的错误ERROR:Could not find C:\users\Richard\workspace\pruebas\bin\ClassName
但是,如果我使用dir命令列出此目录中包含的文件,我可以看到它已列出.
你们有什么可能的原因吗?我做了man javap,据我所知,语法是正确的.
任何想法都非常感谢.
我正在尝试查看我的类的字节码,但即使该.class文件存在,也找不到该类.我可以Main.java从CLI 编译文件,但在使用javap -c Main它时找不到类.
public class Main {
public static void main(String args[]) {
int Y = 0;
int X = (Y + 4) * 3;
}
}
Run Code Online (Sandbox Code Playgroud) 每次我尝试理解已编译的Java文件的反汇编代码时,我都想知道为什么缺少某些指令编号.
一个小例子:
我反汇编($ javap -c HelloWorld)一个简单的HelloWorld类.这是输出:
Compiled from "HelloWorld.java"
public class HelloWorld {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello World!
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
Run Code Online (Sandbox Code Playgroud)
如您所见,构造函数中的指令3和4以及main方法中的一些指令都缺失.
有人知道为什么这些指令编号丢失了吗?是否有一些由于某种原因隐藏的字节码指令?
该javap命令有几个选项,其中之一是-l,可以打印行号和局部变量表.假设已经成功编译了一个java程序并且存在文件"Main.class",那么运行javap -l Main可以产生如下内容:
public static void main(java.lang.String[]);
LineNumberTable:
line 100: 0
line 101: 27
line 275: 54
LocalVariableTable:
Start Length Slot Name Signature
0 55 0 args [Ljava/lang/String;
Run Code Online (Sandbox Code Playgroud)
但是,我在javap -l xxx一个java程序的类文件上使用此命令,但行号和局部变量表的区域为空(不应该是).该javap命令和其他选项(如-s)-verbose工作正常,但只有与该-l选项对应的行信息区域为空.
有没有人遇到过这种奇怪的案子?
实际上,这个问题有点宽泛.我知道javac将java文件编译成字节码,一个类文件.因此,类文件应该包含jvm指令和所有这些.另一方面,查看这些指令的唯一方法是使用javap -c反编译类文件.但它不是反编译,对吧?因为如果它是反编译,它会产生java文件.所以,我的猜测是javac编译java文件2次(实际上并不是真的,但为了简单起见,我们假设),首先是jvm指令,然后是字节码,所以javap -c从字节码反编译为jvm指令.Jvm应该理解字节码,因此它无法理解指令.我在这里有点困惑.有人能解释一下这里发生了什么吗?
我正在玩javap和一些非常简单的代码,这引发了一个 - 希望很简单 - 的问题.
这是代码优先:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(m1());
System.out.println(m2());
}
private static String m1() {
return new String("foobar");
}
private static String m2() {
String str = "foobar";
return new String(str);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我编译了代码并查看了输出(现在省略-verbose).
$ javap -c Main.class
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: getstatic #2 // …Run Code Online (Sandbox Code Playgroud) AFAIK不可能有一个具有相同呼叫签名的方法.然而:
$ javap -public java.time.LocalTime | grep "minus" | grep "Temporal" | grep -v "long"
public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
Run Code Online (Sandbox Code Playgroud)
这些清楚地显示了具有相同呼叫签名的多种方法.
编辑:通过仅保留相关位来简化问题.
Java代码:
public class SimpleRecursion {
public int factorial(int n) {
if (n == 0) {
return 1;
}
return n*factorial(n - 1);
}
}
Run Code Online (Sandbox Code Playgroud)
为factorial方法提供以下字节码(我执行javap来生成它):
Run Code Online (Sandbox Code Playgroud)public int factorial(int); descriptor: (I)I flags: ACC_PUBLIC Code: stack=4, locals=2, args_size=2 0: iload_1 1: ifne 6 4: iconst_1 5: ireturn 6: iload_1 7: aload_0 8: iload_1 9: iconst_1 10: isub 11: invokevirtual #2 // Method factorial:(I)I 14: imul 15: ireturn LineNumberTable: line 4: 0 line 5: 4 line 7: 6 StackMapTable: number_of_entries = 1 frame_type …
我想问一下javap除了传递给它的类的公共字段和方法之外还显示什么。
我正在查看一个只有一个静态变量的类文件。正如预期的那样,javap 将静态变量和类构造函数显示为输出,但它也显示如下内容:
static {};
Run Code Online (Sandbox Code Playgroud)
这条线是什么意思?
我有一些只有类文件的Java基准测试.
我想找到哪些基准测试有JNI调用.
我想也许这可以通过字节码级别来帮助javap -c,但不确定.
有任何想法吗?
我建议限制应该预先声明a.length / 2.一个人告诉他,他相信编译器无论如何都会增强它
所以我试过了.
public class Loop1 {
public static void main(final String[] args) {
final String[] a = {};
for (int i = 0; i < a.length / 2; i++) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
public class Loop2 {
public static void main(final String[] args) {
final String[] a = {};
final int l = a.length / 2;
for (int i = 0; i < l; i++) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我打印这些课程时, …
javap ×11
java ×10
bytecode ×4
javac ×2
jvm ×2
.class-file ×1
block ×1
decompiler ×1
disassembly ×1
mnemonics ×1
optimization ×1
overloading ×1
static ×1