Я пытался найти какое-то приближение для адресации в куче, и вы, ребята, дали мне функцию System.IdentityHashCode(Object)
.
Проблема в том, что эта функция не подходит для примитивных типов.Я объясню, почему.
Мне дают в качестве входного файла скомпилированной программы Java - класс.Моя цель состоит в том, чтобы построить несколько графиков, которые будут содержать некоторую информацию о доступе к переменным во времени.Я понятия не имею, как код выглядит заранее, и моя тактика - это инструментарий моего собственного байт-кода для каждой инструкции LOAD и STORE.Я использую инструментарий ASM Java Bytecode.
Поэтому я не могу сделать что-то вроде:
identityHashCode(Integer.valueOf(...))
, потому что у меня нет указания, является ли тип int, double, long и т. Д..
Я хочу иметь возможность определять между различными экземплярами одного и того же класса:
Например:
class foo {
int a;
}
foo b;
foo c;
b.a++;
c.a++;
Но когда дело доходит до байт-кода, нетсвязь между именем "b" / "c" и атрибутом 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.Поэтому, учитывая этот код, я не могу определить между этими двумя буквами!