【问题标题】:Why getClass returns the name of the class + $1 (or $*)为什么 getClass 返回类的名称 + $1(或 $*)
【发布时间】:2022-01-15 05:18:36
【问题描述】:

我正在编写一段代码,如果它是某个类的实例,我必须在其中强制转换一个 Object。

像往常一样,我使用instanceof 来检查兼容性。

问题是检查永远不会满足,因为对象属于“奇怪的”类。

例如;当我在这个对象上调用 getClass().getSimpleName() 方法时,它返回类的名称 + $*(例如 ViewPart$1 而不是 ViewPart)。

$* 是什么意思? 有解决方案或变通方法吗?

【问题讨论】:

  • 这是一个匿名的内部类吗?

标签: java instanceof


【解决方案1】:

这显示了一个内部类(匿名(如果有数字)或命名)。例如:

class Foo {
    static class Bar {
    }
}

Foo.Bar 的名称是Foo$Bar。现在,如果我们有:

class Foo {

    static void bar() {
        Runnable r = new Runnable() {
            public void run() {};
        };

        System.out.println(r.getClass());
    }
}

这将打印Foo$1

在javac创建的类文件的命名中可以看到同样的效果。

【讨论】:

    【解决方案2】:

    这些是anonymous class 的实例。 ViewPart$1ViewPart 中定义的第一个匿名类——但这并不意味着它是ViewPart 的子类。这很可能是某个 Listener 接口的匿名实现。

    【讨论】:

    • 它是否记录了Class$X 指向Xth 匿名类的事实?
    • @Hablutzel:不,JLS 只说名称应该具有格式,$ 后跟数字。数字序列是编译器的一个实现细节。
    【解决方案3】:

    $ 表示内部类。例如考虑两个类

    public class TopClass {
      class SubClass {
         // some methods
      }// inner class end
    } // outer class end
    

    如果你编译这段代码,你会得到两个类文件 TopClass.class 和 TopClass$SubClass.class。

    检查您的 ViewPart 类是否有任何内部类。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 2023-03-14
      • 1970-01-01
      • 2011-08-14
      相关资源
      最近更新 更多