0

私が証明しようとしている2つのクラスファイルが、まったく同じScalaソースから生成されたものです。

クラスファイルをJavaに逆コンパイルすると、意味的にまったく同じ2つのJavaファイルが得られました。ただし、内部には異なる@ScalaSignatureアノテーションがあります。クラスファイルで「javap-verbose」を実行すると、次の出力が得られました。

...
SourceFile: "ABC.scala"
ScalaSig: length = 0x3
 05 00 00
Signature: #140                         // <T:Ljava/lang/Object;>Lcom/xyz/ABC;Lscala/ScalaObject;Lscala/Product;
Lscala/Serializable;
RuntimeVisibleAnnotations:
  0: #141(#142=s#143)
minor version: 0
major version: 49
flags: ACC_PUBLIC, ACC_SUPER
---

1つのファイルから、および他のファイルから:

...
SourceFile: "ABC.scala"
ScalaSig: length = 0x3
 05 00 00
Signature: #140                         // <T:Ljava/lang/Object;>Lcom/xyz/ABC;Lscala/ScalaObject;Lscala/Product;
Lscala/Serializable;
RuntimeVisibleAnnotations:
  0: #141(#142=s#143)
minor version: 0
major version: 49
flags: ACC_PUBLIC, ACC_SUPER
...

2つのクラスファイルが同じScalaソースから取得され、同じScalaSig、Signatureなどでアノテーションが付けられていても、@ ScalaSignatureアノテーションが異なる可能性はありますか?

ありがとう。

4

1 に答える 1

2

2つのscalaソースファイルが同じバイトコードになる可能性があります(sigを除く)。確かに、元のソースファイルが異なっていたことを示すのはsigです。したがって、2つのクラスファイルが同じscalaソースからのものであることを証明することはできません。

たとえば、2つのクラスのメソッドが同じで、型パラメーターが異なる場合、同じバイトコードを取得しますが、sigは異なります。

簡単な例として、次のクラスを見てください。

class Foo {
  def fn1(t: String) = "" + t
  def fn2[T <: String](t : T) = "" + t
}

これらの2つのメソッドでは、まったく同じバイトコードが生成されますが、sigは異なります。

public java.lang.String fn1(java.lang.String);
  Code:
   Stack=1, Locals=2, Args_size=2
   0:   aload_1
   1:   invokestatic    #12; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   4:   areturn
  LineNumberTable:
   line 2: 0

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      5      0    this       LFoo;
   0      5      1    t       Ljava/lang/String;

  Signature: length = 0x2
   00 12

public java.lang.String fn2(java.lang.String);
  Code:
   Stack=1, Locals=2, Args_size=2
   0:   aload_1
   1:   invokestatic    #12; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   4:   areturn
  LineNumberTable:
   line 3: 0

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      5      0    this       LFoo;
   0      5      1    t       Ljava/lang/String;
于 2012-10-19T18:57:57.240 に答える