如何在 Eclipse 中找到一个匿名内部类,只给出它的合成名称 (Class$N)?

Posted

技术标签:

【中文标题】如何在 Eclipse 中找到一个匿名内部类,只给出它的合成名称 (Class$N)?【英文标题】:How can I find an anonymous inner class in Eclipse given only its synthetic name (Class$N)? 【发布时间】:2015-04-27 08:16:23 【问题描述】:

如果我在使用 Eclipse 时只获得了类的名称 Class$N,而无需查看代码并对每个匿名类进行计数,如何找到匿名内部类?是否有“跳转到匿名类声明”功能,我可以在其中输入 $suffix 数字?

搜索->Java 功能没有帮助。

我正在使用 VisualVM 来查找 CPU 热点。我的热点位于名为 SomeClass$5 的匿名类中。 VisualVM 找不到我的课程的源,我(和其他人)找不到如何将源附加到 VisualVM,显示为here 和here。启动器插件无法解决此问题。

计算匿名声明不是一种选择,因为从长远来看,人为错误排序数百行的风险可能会导致浪费大量时间尝试处理错误的匿名类,只是为了找出它是错误的课程。

作为一种解决方法,我正在使用'System.out.println("this="+this.getClass().getName());' 测试类以确保它是正确的,但必须有更好的方法。

【问题讨论】:

好问题。我知道两种方法:计数(容易出错)和给类命名(即将匿名类变成内部类),这会破坏匿名类的好处。另外,当我想到 Java 8 时……应该有更好的方法。 另外两种查找声明的方法:Class.forName("SomeClass$5").getEnclosingClass/Method/Constructor()(但如果同一范围内有许多匿名类,则可能会模棱两可)。 javap -v SomeClass$5.class 并检查方法的 LineNumberTable 属性(但如果 .class 文件在没有调试信息或经过混淆的情况下编译,则可能不存在)。 (这些无助于让 Eclipse 或 VisualVM 自动找到您的代码,因此请不要回答所提出的问题。) 有关 YourKit Java Profiler 的信息:“...请注意查找匿名类及其方法的代码的非常有用的功能,而手动执行此操作非常困难。” [链接]yourkit.com/docs/80/help/eclipse.jsp @JeffreyBosboom 你的想法很棒,为什么不回答一下呢? @BastianVoigt 我觉得它没有回答问题(关于使用 Eclipse),但它们是有用的解决方法。我会写一个答案。 【参考方案1】:

我不知道如何在 Eclipse 中执行此操作,但我可以提供另外两种查找声明的方法。


您可以调用Class.forName("SomeClass$5"),然后调用Class.getEnclosingMethod 或Class.getEnclosingConstructor 或Class.getEnclosingClass 之一来查找其直接封闭的定义。如果多个匿名类位于同一个封闭成员中,这可能会产生歧义,但它为您提供了开始查找的地方。


您可以使用带有javap -v SomeClass$5.class 的javap 工具来反汇编已编译的类文件。如果类文件是使用调试信息编译的,并且匿名类包含至少一个方法定义,则这些方法定义的LineNumberTable 属性将指示它们在源文件中的定义位置。 SourceFile 属性将包含源文件名。 EnclosingMethod 属性将命名封闭方法(如果有的话),InnerClasses 属性将包含有关封闭类和内部类的信息(包括仅使用的无关类,所以要小心口译时)。

【讨论】:

以上是关于如何在 Eclipse 中找到一个匿名内部类,只给出它的合成名称 (Class$N)?的主要内容,如果未能解决你的问题,请参考以下文章

java 如何调用局部内部类和匿名类

如何从匿名内部类更改外部变量?

反编译中的 匿名内部类 this.val$的问题

java提高篇-----详解匿名内部类

Java 中如何使用匿名内部类?

Java内部类之匿名内部类