是否可以使用新的反射库显示保存在字节码中的完整类型签名(带有已擦除的参数化类型)?
例如类型
Any => Unit
应显示为
"scala.Function1<java.lang.Object,scala.runtime.BoxedUnit>"
因为这是存储在字节码中的类型。可以用 显示这种类型javap
。第一个需要编译一些代码scalac
:
object X {
def m(f: Any => Unit) = f
}
命令javap -c -s -l -verbose X$
显示:
...
const #25 = Asciz (Lscala/Function1<Ljava/lang/Object;Lscala/runtime/BoxedUnit;>;)Lscala/Function1<Ljava/lang/Object;Lscala/runtime/BoxedUnit;>;;
...
public scala.Function1 m(scala.Function1);
Signature: (Lscala/Function1;)Lscala/Function1;
...
的输出javap
有点奇怪,我更感兴趣的是获得“类似 Java”的输出。也许一个代表类型签名的字符串是一个更好的类型,可以很容易地生成这个字符串。
另一个例子:
package abc
object O {
def x(i: Int)(j: Int) = i+j
}
// type of x should be displayed something like
"int abc.O$.x(int, int)"
是否已经支持这样的东西,如果没有,如何为任何类型构建这样的输出?