【问题标题】:Getting inner class type name获取内部类类型名称
【发布时间】:2014-04-11 16:29:42
【问题描述】:

我正在尝试获取在类中实例化的类型(它是一个接口)的名称,但我尝试过的可用方法不返回该类型的实际名称。

例子:

为了得到我会做的名字:

class Test {

    void test(Object o) {
        System.out.println(o.getClass());
    }

}

以java.lang.Runnable接口为例:

...
test(new Runnable() {});

会打印出类似class test.Test$2 的内容,我在Class 类中尝试过其他方法,但它们只是打印出null 或test.Test。我怎么能从中得到class java.lang.Runnable

谢谢!

【问题讨论】:

    标签: java class inner-classes anonymous-inner-class


    【解决方案1】:

    对于内部匿名类,你可以这样做:

    void test(Object o) {
        if(o.getClass().isAnonymousClass()) {
          System.out.println(o.getClass().getInterfaces()[0].getName());
        } else {
          System.out.println(o.getClass().getName());
        }        
    }
    

    【讨论】:

    • 如果您将Inner 更改为接口而不是类,这是否有效?
    • @EmilH 如果您向 test 提供 Inner 的匿名实现,则应该这样做。
    • 用一个界面试了一下,在这种情况下它会打印java.lang.Object。通过使用getInterfaces,可以得到接口o的类实现的Class表示。
    • @EmilH 问题在于,采用哪个接口。当然,可以只取第一个,也可以使用Arrays.toString()
    • 它看起来确实有点“狡猾”,但它仍然有效,谢谢!顺便说一句,[0]() 处的错字
    【解决方案2】:

    你可以通过简单地做一个instanceof检查来做到这一点:

    void test(Object o) {
        System.out.println(o instanceof Runnable);
    }
    

    如果对象实现了 Runnable 接口,这将打印true

    如果您想要一个更动态的解决方案(例如,如果您想打印 Object o 的所有接口),您必须执行以下操作:

    void test(Object o) {
        for (Class i : o.getClass().getInterfaces()) {
            System.out.println(i.getName());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 2011-02-04
      • 2010-09-15
      • 1970-01-01
      • 2013-11-29
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多