私はヒープで対処するためのいくつかの近似を見つけようとしていました、そしてあなたたちは私に関数を与えましたSystem.IdentityHashCode(Object)
。
問題は、この関数がプリミティブ型に適合しないことです。その理由を説明します。
私は入力Javaコンパイル済みプログラム-クラスファイルとして与えられます。私の目標は、時間間の可変アクセスに関する情報を含むいくつかのグラフをプロットすることです。コードがどのように見えるかを前もって知りません。私の戦術は、すべてのLOADおよびSTORE命令に対して自分のバイトコードをインストルメント化することです。ASM JavaBytecodeInstrumentationを使用しています。
したがって、私は次のようなことはできません。
identityHashCode(Integer.valueOf(...))
タイプがint、double、longなどであるかどうかがわからないためです。
同じクラスの異なるインスタンスを判別できるようにしたい:
例えば :
class foo {
int a;
}
foo b;
foo c;
b.a++;
c.a++;
しかし、バイトコードに関しては、名前「b」/「c」と属性aの間に関係はありません。私が「見る」のは、aがインクリメントされることだけです。どちらも!と見なされます もしそうなら、Object a
System.identityHashCode()を使用してそれらを区別することができたはずです。しかし、私はできません。
明確にするために、次の例を見てください。
package manipulate;
public class Test {
int c;
public static void main(String[] args) {
Test a=new Test();
Test b=new Test();
a.c++;
b.c++;
}
}
これは(主な機能)次のバイトコードに変換されます:
L0
LINENUMBER 7 L0
NEW manipulate/Test
DUP
INVOKESPECIAL manipulate/Test.<init>()V
ASTORE 1
L1
LINENUMBER 8 L1
NEW manipulate/Test
DUP
INVOKESPECIAL manipulate/Test.<init>()V
ASTORE 2
L2
LINENUMBER 9 L2
ALOAD 1
DUP
GETFIELD manipulate/Test.c : I
ICONST_1
IADD
PUTFIELD manipulate/Test.c : I
L3
LINENUMBER 10 L3
ALOAD 2
DUP
GETFIELD manipulate/Test.c : I
ICONST_1
IADD
PUTFIELD manipulate/Test.c : I
L4
LINENUMBER 11 L4
RETURN
ご覧のとおり、スタックにあるのは整数cの値だけです。したがって、そのコードを考えると、これら2つのcのどちらかを判断することはできません。