Чтобы получить hashCode() объекта, который вызывает определенный метод в Java
Я пытаюсь получить значение hashCode() объекта, который вызывает определенный метод в Java. Например,
public class Caller {
public void aMethod() {
Callee calleeObj = new Callee();
calleeObj.aSpecificMethod();
//do something
}
}
То, что я хочу знать, это значение hashCode() в Caller, которое вызывает calleeObj.aSpecificMethod()
во время выполнения. Это для рисования диаграммы объекта, как показано ниже.
В качестве ограничения я могу изменять только файлы ".class", используя методы инструментирования байт-кода.
Чтобы сделать это, я пытался Javassist
библиотека для инструмента внутри Callee.aSpecificMethod()
но этот способ не может получить объект вызывающего. Причина кажется очевидной, потому что инструментальный код наCallee.aSpecificMethod()
'только могут получить доступ к кодам на Callee
класс, а не Caller
учебный класс.
Есть ли способ захватить значение hashCode() объекта вызывающего с помощью Javassist? Я также рассматриваю ASM 5.0, но использование ASM 5.0 - последний вариант, потому что я до сих пор создавал много кода на основе Javassist.
2 ответа
Как говорили другие, нет способа вызвать вызванный метод для получения доступа к вызывающему объекту, но до сих пор никто не указал вам причину, почему это никогда не будет возможно:
Большое неправильное представление о вашем запросе заключается в том, что вы предполагаете, что должен быть "объект вызывающего абонента". Но такого нет. Ваш метод может быть вызван static
методы, например, прямо из main
метод приложения, но также из инициализаторов классов или из конструкторов, даже во время super
вызов конструктора, другими словами, в местах, где объект существует в контексте вызова, но еще не полностью создан, следовательно, в месте, где hashCode()
не может быть вызван.
Если вы не учли эти пробелы в своей идее, вам не следует начинать использовать Instrumentation для изменения байтовых кодов вызывающей стороны. Маловероятно, что вы создадите правильный код. Даже в тех местах, где экземпляр существует на вызове, этот экземпляр не должен быть доступен, равно как и вычисление хеш-кода. Что, если вы вызываете метод из другого объекта hashCode
метод?
Помимо практических препятствий, большой вопрос в том, зачем вам нужен хеш-код "вызывающих"? Что бы вы ни собирались с этим делать, это не может быть правильно. Подумайте о следующем коде:
public class Caller {
public void aMethod() {
Callee calleeObj = new Callee();
new Thread(calleeObj::aSpecificMethod).start();
}
}
Чей хэш-код вас интересует? Из экземпляра анонимного класса, созданного во время выполнения? Из Thread
экземпляр, ссылающийся на run
метод этого анонимного класса? Или из Caller
экземпляр, который вообще не будет в стеке вызовов, когда ваш метод будет вызван?
Вы должны передать вызывающему объекту или его хэш-коду в качестве параметра метода.