Чтобы получить 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 экземпляр, который вообще не будет в стеке вызовов, когда ваш метод будет вызван?

Вы должны передать вызывающему объекту или его хэш-коду в качестве параметра метода.

Другие вопросы по тегам