在上一个问题中,从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.None和scala.Option.如何从javap输出中找出:
None是唯一None.type延伸的类型的对象Optionapply()伴侣对象的方法是必需的?
在一个非常简单的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手册页有很多不足之处.
scala 2.9.1控制台中的':javap'命令需要'classpath'中的tools.jar(来自JDK6).从cmd-line可以使用'-cp'参数或CLASSPATH环境变量来完成.
如何对使用'console'和'console-quick'命令从SBT调用的scala控制台执行相同的操作?
是否有类似于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"),但我找不到另外两个"工具":
正如标题所述,我正在尝试使用javapeclipse但很难设置它.我试图将其设置使用external tools从run菜单中却找不到正确的Arguments:字符串,使其工作.基本上我需要能够动态执行我打开的当前文件的东西.
我想使用javap工具列出jar中类文件的方法.我该怎么做才能列出jar中所有类文件的方法和成员.现在我能够一次只为一个班级做这件事.
我期待像我说的那样
javap java.lang.*
Run Code Online (Sandbox Code Playgroud)
它应该在java.lang包中登记所有类的方法和成员.如果javap不具备此功能,是否有可用的工具?
在我的系统(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转换为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方法填充我的类.
那么在这种情况下你会做什么?
当我在命令行中写入时javap -s java.awt.Label,我成功地获得了签名Label.现在我想获得Android Activity类的签名.但如果我把javap -s android.app.activity它写成结果ERROR: Could not find android.app.activity.
我究竟做错了什么?我应该改变PATH env var中的某些东西吗?