【问题标题】:Get Class Type from Reflection Java [duplicate]从反射Java获取类类型[重复]
【发布时间】:2015-07-19 18:44:50
【问题描述】:

当我调用类中的方法时,该方法将获得使用sun.reflect.Reflection.getCallerClass(2) 调用它的java.lang.Class。这不是我想要的。我希望反射返回调用它的类 Object(即,如果我从 Bar 类调用方法,Reflection.getCallerClass() 返回类型为 Bar 的对象)

假设我有这个类:

public class Foo {
    public static void printOutCallerObject() {
        System.out.println(classTypeThatCalledOnMethod);
    }
}

调用者:

public class Bar {
    public static void main(String[] args) {
        Foo.printOutCallerObject();
    }
}

然后程序会打印出“Bar”。

【问题讨论】:

  • 这不清楚。您是说要检索实际调用的实例,而不仅仅是类?
  • 没有很好的方法来做到这一点。这可能的,但它也经常是非常糟糕的设计!我见过的唯一用途是记录,记录器应该自动为您处理...您可以使用Thread.currentThread().getStackTrace() 获取此信息。
  • 您为什么要这样做?听起来像XY problem
  • @VinceEmigh 一个常见的用例是日志记录和相关的代码检查。当然可能有更好的方法来解决它(例如,使用调试器单步执行),但想要这样做并非完全不合理。
  • @dimo414 这就是面向方面编程的设计目的。 AspectJ 可以帮助他实现他想要的。但正如我之前所说,他问的是他觉得应该如何记录日志,而不是问他应该如何记录日志。他可以通过避免 XY 问题得到更好的答案。他应该使用某种日志系统,以确保日志逻辑不会与其他逻辑混合

标签: java reflection


【解决方案1】:

这里有一个快速演示如何获取调用 class - 你无法获取调用 object 除非你将它传递给方法,因为它不在堆栈上.

public class ReflectDemo {
    public static class Foo {
        public static void printOutCallerObject() {
            StackTraceElement[] trace = Thread.currentThread().getStackTrace();
            // trace[0] is Thread.getStackTrace()
            // trace[1] is Foo.printOutCallerObject()
            // trace[2] is the caller of printOutCallerObject()
            System.out.println(trace[2].getClassName());
        }
    }

    public static class Bar {
        public static void barMain() {
            Foo.printOutCallerObject();
        }
    }

    public static void main(String[] args) {
        Foo.printOutCallerObject();
        Bar.barMain();
    }
}

打印出来:

ReflectDemo
ReflectDemo$Bar

Foo.printOutCallerObject(); 将打印出任何代码调用它的类。对Thread.currentThread().getStackTrace() 的调用并不便宜,因此请注意您可能会产生一些运行时成本。这种模式通常用于日志记录,记录哪段代码触发了日志记录调用。

【讨论】:

  • 这不是我需要的——我需要跟踪来返回一个Bar 对象。不是类对象。
  • @LucasBaizer 就像我说的,这是不可能的。调用对象在堆栈上不可用。解决方法是将this 作为参数传递给printOutCallerObject()
猜你喜欢
  • 2014-07-07
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多