Получить класс по имени из трассировки стека - PullRequest
1 голос
/ 30 июня 2019

В классе я пытаюсь определить, кто первоначально вызвал цепочку вызовов, используя трассировку стека потока:

StackTraceElement trace = Thread.getStackTrace();
for (int index = 3; index < trace.length; index++ ) {
    String className = trace[index].getClassName();

Теперь я знаю, что вызов всегда будет инициироваться супертипом MyObject, но я хотел бы знать, какой подкласс фактически начал вызов для целей регистрации / аудита.

Сначала я пытаюсь выяснить, могу ли я логически сопоставить суперклассы, но даже это не помогает;Я перепробовал все 4 из следующего, но все они, похоже, возвращают false:

Пошагово, я вижу, что нахожусь в цикле с правильным className , который является моимдочерний элемент, который расширяет MyObject

    if (Class.forName(className).isAssignableFrom(MyObject.class)) {
    if (MyObject.isAssignableFrom(Class.forName(className))) {

    if (Class.forName(className).instanaceOf(MyObject.class)) {
    if (MyObject.instanaceOf(Class.forName(className))) {

Как еще я могу проверить, если имя моего класса расширяет определенного родителя?

1 Ответ

3 голосов
/ 30 июня 2019

Stacktrace ссылается на каждый метод (class: method: line), который был вызван из начального потока до места, где вы запросили stracktrace.
Stacktrace разработан, чтобы понять, какой код / ​​операторы были выполнены, а не знатькласс времени выполнения, который вызвал метод (хотя вы можете знать его при некоторых обстоятельствах).
Фактически вы будете знать класс времени выполнения вызванного метода, пока он не наследуется или что он наследуется, но переопределяется.
ДляНапример, если вы не переопределите toString() в Foo, toString() будет ссылаться на Object.toString() в трассировке.

Таким образом, чтобы удовлетворить ваши требования вашим реальным способом, вам нужно переопределить точку входа классов, которые вы хотите проверять, и затем вызвать super.theMethod().
Но более чистый способ, вероятно, использует AOP (AspectJ или Spring AOP) для захвата любой информации, которую вы будете использовать.Например, в аспекте аудита методов точки входа вы можете использовать getClass(), чтобы узнать тип объекта.

...