标签: javap

尝试使用javap.exe反编译java .class文件

我有一些我想要反编译的.class文件.所以这就是我所做的:我总是遇到 javap -c "C:\users\Richard\workspace\pruebas\bin\ClassName"同样的错误ERROR:Could not find C:\users\Richard\workspace\pruebas\bin\ClassName

但是,如果我使用dir命令列出此目录中包含的文件,我可以看到它已列出.

你们有什么可能的原因吗?我做了man javap,据我所知,语法是正确的.

任何想法都非常感谢.

java decompiler javap

3
推荐指数
1
解决办法
3792
查看次数

尝试使用javap时,我收到"Error:class not found"

我正在尝试查看我的类的字节码,但即使该.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

3
推荐指数
1
解决办法
5399
查看次数

javap输出中缺少指令编号

每次我尝试理解已编译的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方法中的一些指令都缺失.

有人知道为什么这些指令编号丢失了吗?是否有一些由于某种原因隐藏的字节码指令?

java bytecode mnemonics disassembly javap

3
推荐指数
1
解决办法
233
查看次数

javap -l选项无法显示行号信息

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选项对应的行信息区域为空.

有没有人遇到过这种奇怪的案子?

java javap

2
推荐指数
1
解决办法
1729
查看次数

javap -c对类文件的作用是什么?

实际上,这个问题有点宽泛.我知道javac将java文件编译成字节码,一个类文件.因此,类文件应该包含jvm指令和所有这些.另一方面,查看这些指令的唯一方法是使用javap -c反编译类文件.但它不是反编译,对吧?因为如果它是反编译,它会产生java文件.所以,我的猜测是javac编译java文件2次(实际上并不是真的,但为了简单起见,我们假设),首先是jvm指令,然后是字节码,所以javap -c从字节码反编译为jvm指令.Jvm应该理解字节码,因此它无法理解指令.我在这里有点困惑.有人能解释一下这里发生了什么吗?

java javac javap

2
推荐指数
1
解决办法
784
查看次数

javac也是内联的吗?

我正在玩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)

jvm bytecode javap

2
推荐指数
1
解决办法
631
查看次数

Java类有两个具有相同函数签名但返回类型不同的方法

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)

这些清楚地显示了具有相同呼叫签名的多种方法.

  1. Java如何解析函数调用?
  2. 为什么有多种功能?

编辑:通过仅保留相关位来简化问题.

java overloading javap

2
推荐指数
1
解决办法
1190
查看次数

Java字节码中的堆栈= 4.Java Compiler如何计算4值?(堆栈的深度)

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来生成它):

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 …
Run Code Online (Sandbox Code Playgroud)

java jvm bytecode javac javap

2
推荐指数
1
解决办法
79
查看次数

什么是静态代码块?

我想问一下javap除了传递给它的类的公共字段和方法之外还显示什么。

我正在查看一个只有一个静态变量的类文件。正如预期的那样,javap 将静态变量和类构造函数显示为输出,但它也显示如下内容:

static {};
Run Code Online (Sandbox Code Playgroud)

这条线是什么意思?

java static block javap

1
推荐指数
1
解决办法
483
查看次数

给定一个类文件,如何检测它是否使用JNI?

我有一些只有类文件的Java基准测试.

我想找到哪些基准测试有JNI调用.

我想也许这可以通过字节码级别来帮助javap -c,但不确定.

有任何想法吗?

java java-native-interface bytecode javap .class-file

0
推荐指数
1
解决办法
233
查看次数

编译器优化字节码的情况

我曾经在这里评论.

我建议限制应该预先声明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)

当我打印这些课程时, …

java compiler-construction optimization javap

0
推荐指数
1
解决办法
259
查看次数