首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用scala的repl :javap查看特征伴侣对象

无法使用scala的repl :javap查看特征伴侣对象
EN

Stack Overflow用户
提问于 2014-04-28 17:37:20
回答 1查看 908关注 0票数 2

我在scala中使用了:javap命令,并试图查看特性伙伴对象,但我似乎无法找到方法。下面是我从命令行所做的工作。

代码语言:javascript
复制
$ cat > Foo.scala <<EOF
trait Foo {
  def foo: String
  def echo = println(foo)
}
EOF
$ scalac Foo.scala
$ javap Foo.class
Compiled from "Foo.scala"
public abstract class Foo$class {
  public static void echo(Foo);
  public static void $init$(Foo);
}
$ javap Foo\$class.class
Compiled from "Foo.scala"
public abstract class Foo$class {
  public static void echo(Foo);
  public static void $init$(Foo);
}

我在repl中尝试了同样的方法,并得到了以下内容(使用Bar,因为Foo将在.中编译,因此repl会捡起它)

代码语言:javascript
复制
scala> trait Bar {
     | def bar: String
     | def echo = println(bar)
     | }
defined trait Bar

scala> :javap Bar
Compiled from "<console>"
public interface Bar{
    public abstract java.lang.String bar();
    public abstract void echo();
}


scala> :javap Bar$class
Failed: Could not find class bytes for 'Bar$class'

Scala版本的repl

代码语言:javascript
复制
$ scala -version
Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL

在mac上运行

编辑:刚刚下载了Scala2.11并在那里运行了repl。看起来:javap能够获取类,但是它的运行:javap -v而不是:javap。切换到:javap -p使此输出与2.10相同

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-28 19:56:36

您不是在询问同伴模块,而是询问特性实现类。

没有找到类字节是2.10中的一个错误,在2.11中是固定的。

如果您有一个伴生对象,则当前必须使用它的编码名称,如Bar$

代码语言:javascript
复制
scala> :pa
// Entering paste mode (ctrl-D to finish)

trait Bar { def bar: Int }
object Bar { def apply() = new Bar { def bar = 8 } }

// Exiting paste mode, now interpreting.

defined trait Bar
defined object Bar

scala> :javap -prv Bar$
Binary file Bar$ contains $line3.$read$$iw$$iw$Bar$
  Size 701 bytes
  MD5 checksum a46d3c3cb62cb5ed3521a697023e82dd
  Compiled from "<console>"
public class $line3.$read$$iw$$iw$Bar$
[snip]

关于你的冲动类例子,我认为你是在要求:

代码语言:javascript
复制
scala> :javap -public x.Foo$class
Compiled from "x.scala"
public abstract class x.Foo$class {
  public static void echo(x.Foo);
  public static void $init$(x.Foo);
}

注意:

代码语言:javascript
复制
scala> :javap -help
usage       :javap [opts] [path or class or -]...
-help       Prints this help message
-raw        Don't unmangle REPL names
-app        Show the DelayedInit body of Apps
-fun        Show anonfuns for class or Class#method
-verbose/-v Stack size, number of locals, method args
-private/-p Private classes and members
-package    Package-private classes and members
-protected  Protected classes and members
-public     Public classes and members
-l          Line and local variable tables
-c          Disassembled code
-s          Internal type signatures
-sysinfo    System info of class
-constants  Static final constants

代码语言:javascript
复制
val DefaultOptions = List("-protected", "-verbose")

“帮助”菜单可以更多地说明使用术语Bar而不是类型;可能会有一个即将出现的-demo,它显示了各种用法。

我本来打算用反射API来开玩笑的-- :javap TermName("Bar") --但也许这不是个玩笑。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23347640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档