【发布时间】:2011-09-20 10:04:43
【问题描述】:
给定java.lang.Class 对象,是否有可能获取源文件名和声明类的行号?
数据应该在.class 文件的调试信息中可用。我所知道的JDK返回此类调试信息的唯一地方是java.lang.StackTraceElement,但我不确定是否可以强制Java为任意类创建java.lang.StackTraceElement实例,因为我们没有执行方法在课堂上。
我的确切用例是一个匿名内部类,它有一个编译器生成的名称。我想知道类声明的文件名和行号。
我不喜欢使用字节码操作框架,但如果需要,我可以回退到它。
【问题讨论】:
-
为什么?通过确定这些信息,您希望为最终用户提供什么功能?
-
@AndrewThompson 在调试应用程序时,您会看到一个具有多个实例的泛型类的对象。但是所有这些实例都引用了
Listener实例,其中Listener是一个接口或抽象类。您可以通过Listener引用的具体类来区分它们:如果它是XxxListener,您阅读XxxListener.java并了解它会做什么,但如果Listener是SomeOuterClass$12的实例? -
@saintali - 您刚刚提出了为什么应该将所有侦听器定义为命名类的论据。它将添加 一个 额外的代码行,但会简化调试,使您创建 GUI 对象的方法更具可读性,并使您的模块更易于整体维护。
-
@parsifal - 你的论点实际上意味着完全禁止匿名类,因为它们无论如何都不会获得有意义的名称,而且没有名称的调试很困难。我不同意那个论点。匿名内部类是一种有用的语言特性,当 lambda 语法糖被添加到 Java 中时,它们将变得更加普遍。所以我相信我们必须找到一种方法来启用调试,而不是相反。
-
@saintali - 我的论点并不意味着禁止匿名内部类,只是限制它们的使用。对于短期或有限范围的操作,我没有问题。长期存在或范围广泛的事物应该有自己的名字。
标签: java reflection debug-symbols