标签: javap

"javap"中的"p"代表什么?

"javap"中的"p"代表什么?("javac"中的"c"代表编译器)

javap

34
推荐指数
2
解决办法
7539
查看次数

如何学习使用javap从Java中使用scala.None?

在上一个问题中,从Java访问scala.None,似乎人们已经习惯javap了解如何scala.None从Java 访问.我想知道他们是怎么做到的.仅供参考,答案是:

scala.Option$.MODULE$.apply(null);
Run Code Online (Sandbox Code Playgroud)

可以缩短为:

scala.Option.apply(null);
Run Code Online (Sandbox Code Playgroud)

鉴于此计划(OptionTest.scala):

object OptionTest extends App {
  val x = scala.None
  val y = scala.Some("asdf")
}
Run Code Online (Sandbox Code Playgroud)

我这样跑javap了:

javap -s -c -l -private OptionTest
Run Code Online (Sandbox Code Playgroud)

这是javap输出的一部分:

public static final scala.None$ x();
  Signature: ()Lscala/None$;
  Code:
   0:   getstatic  #11; //Field OptionTest$.MODULE$:LOptionTest$;
   3:   invokevirtual  #55; //Method OptionTest$.x:()Lscala/None$;
   6:   areturn
Run Code Online (Sandbox Code Playgroud)

我也javap的上运行scala.Nonescala.Option.如何从javap输出中找出:

  1. None是唯一None.type延伸的类型的对象Option
  2. apply()伴侣对象的方法是必需的

scala javap scala-java-interop

33
推荐指数
2
解决办法
4437
查看次数

了解常量池的javap输出

在一个非常简单的HelloWorld应用程序上运行javap时,我对常量池周围的输出有些困惑.

测试代码

public class TestClass {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}
Run Code Online (Sandbox Code Playgroud)

Javap -c -verbose输出(剪切)

// Header + consts 1..22 snipped
const #22 = String      #23;    //  hello world
const #23 = Asciz       hello world;

public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #22; //String hello world
   5:   invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return
  // Debug info snipped
}
Run Code Online (Sandbox Code Playgroud)

好的,所以在第3行我们看到通过#22将"hello world"常量推送到堆栈上,但const#23似乎保持实际值.我想我对#(数字)在打印输出右侧出现时的含义有点困惑.

Oracle/Sun的javap手册页有很多不足之处.

java javap java-bytecode-asm

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

在sbt项目的类路径中添加tools.jar

scala 2.9.1控制台中的':javap'命令需要'classpath'中的tools.jar(来自JDK6).从cmd-line可以使用'-cp'参数或CLASSPATH环境变量来完成.

如何对使用'console'和'console-quick'命令从SBT调用的scala控制台执行相同的操作?

scala javap sbt scala-2.9

18
推荐指数
2
解决办法
7108
查看次数

是否有java的反汇编程序和调试程序(ala OllyDbg/SoftICE for assembler)?

是否有类似于OllyDbg/SoftICE for java的实用程序?即执行类(来自jar/with class path),并且在没有源代码的情况下,显示中间代码的反汇编,能够逐步执行/跳过/搜索引用/编辑内存中的特定中间代码/将编辑应用到文件中. .

如果没有,是否可以写这样的东西(假设我们愿意在调试期间没有热点的情况下生活)?

编辑:我不是在谈论JAD或JD或Cavaj.这些是很好的反编译器,但我不想要一个反编译器有几个原因,最值得注意的是它们的输出不正确(充其量,有时只是简单的错误).我不是在寻找一个神奇的"编译到java代码的字节" - 我想看到即将执行的实际字节.此外,我希望能够更改这些字节(就像在汇编调试器中一样),并希望将更改的部分写回类文件.

Edit2:我知道javap存在 - 但它只有一种方式(并且没有任何分析).示例(代码取自vmspec文档):从java代码中,我们使用"javac"来编译:

void setIt(int value) {
    i = value;
}
int getIt() {
    return i;
}
Run Code Online (Sandbox Code Playgroud)

到java .class文件.使用javap -c我可以得到这个输出:

    Method void setIt(int)
   0    aload_0
   1    iload_1
   2    putfield #4
   5    return
    Method int getIt()
   0    aload_0
   1    getfield #4
   4    ireturn
Run Code Online (Sandbox Code Playgroud)

这对于反汇编部分是可以的(没有分析就不太好 - "字段#4是Example.i"),但我找不到另外两个"工具":

  1. 一个调试器,它遍历指令本身(带有堆栈,内存转储等),允许我检查实际的代码和环境.
  2. 一种扭转过程的方法 - 编辑反汇编代码并重新创建.class文件(使用编辑过的代码).

java debugging system disassembly javap

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

如何在eclipse中使用javap?

正如标题所述,我正在尝试使用javapeclipse但很难设置它.我试图将其设置使用external toolsrun菜单中却找不到正确的Arguments:字符串,使其工作.基本上我需要能够动态执行我打开的当前文件的东西.

java eclipse javap

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

如何使用javap工具在jar文件中打印类结构?

我想使用javap工具列出jar中类文件的方法.我该怎么做才能列出jar中所有类文件的方法和成员.现在我能够一次只为一个班级做这件事.

我期待像我说的那样

javap java.lang.*
Run Code Online (Sandbox Code Playgroud)

它应该在java.lang包中登记所有类的方法和成员.如果javap不具备此功能,是否有可用的工具?

java command-line javap

16
推荐指数
2
解决办法
2万
查看次数

Java:javap错误:找不到.class

在我的系统(Ubuntu 10.04)中java运行正常,但是我无法运行javap命令
我有complile Foo类和.class文件路径位于
/ home/mahesh/java/opt
当我执行
javap -c Foo.class
I获取以下错误消息:
错误:找不到Foo.class
是否需要设置任何环境变量或任何其他东西来解决它.我的$ PATH变量的目标是:
/ usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games:/ usr/lib/jvm/bin /
谢谢.

java javap

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

我如何将scala setter方法'myvar_ $ eq(myval)'别名为在java中更令人满意的东西?

我最近将一些代码从java转换为scala,试图自学语言.

假设我们有这个scala类:

class Person() {
  var name:String = "joebob"
}
Run Code Online (Sandbox Code Playgroud)

现在我想从java访问它,所以我不能像我在scala那样使用点符号.

所以我可以通过发出以下内容来获取我的var的内容:

person = Person.new();
System.out.println(person.name());
Run Code Online (Sandbox Code Playgroud)

并通过以下方式设置:

person = Person.new();
person.name_$eq("sallysue");
System.out.println(person.name());
Run Code Online (Sandbox Code Playgroud)

这是正确的,因为我们的Person类在javap中看起来像这样:

Compiled from "Person.scala"
public class Person extends java.lang.Object implements scala.ScalaObject{
    public Person();
    public void name_$eq(java.lang.String);
    public java.lang.String name();
}
Run Code Online (Sandbox Code Playgroud)

是的,我可以编写自己的getter/setter但是我讨厌用这个来填充类,考虑到我已经拥有它们并没有多大意义 - 我只想更好地为_ $ eq方法添加别名.(当你处理像antlr这样的东西时,这实际上会变得更糟,因为那时你必须逃避它,它最终看起来像person.name _\$ eq("newname");

注意:我宁愿忍受这个,而不是用更多的setter方法填充我的类.

那么在这种情况下你会做什么?

java setter scala javap scalac

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

使用javap为Android Activity获取方法签名

当我在命令行中写入时javap -s java.awt.Label,我成功地获得了签名Label.现在我想获得Android Activity类的签名.但如果我把javap -s android.app.activity它写成结果ERROR: Could not find android.app.activity.

我究竟做错了什么?我应该改变PATH env var中的某些东西吗?

android javap

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