如何从匿名类中获取原始类? Java的

时间:2017-07-20 17:41:15

标签: java reflection

我无法弄清楚如何获得定义匿名内部类的原始抽象类或接口。

例如:

public static void main(String[] args) {
    Object obj = new Runnable() {

        @Override
        public void run() {
        }
    };

    System.out.println(obj.getClass());
    System.out.println(obj.getClass().getSuperclass()); //Works for abstract classes only
}

输出:

class my.package.MyClass$1
class java.lang.Object

我怎样才能获得原班? (在这种情况下为Runnable.class

3 个答案:

答案 0 :(得分:3)

感谢您的帮助!没有人真的完全回答我的问题,所以我决定发布我的解决方案:

public static Class<?> getOriginalClass(Object obj) {
    Class<?> cls = obj.getClass();
    if (cls.isAnonymousClass()) {
        return cls.getInterfaces().length == 0 ? cls.getSuperclass() : cls.getInterfaces()[0];
    } else {
        return cls;
    }
}

缩短:

public static Class<?> getOriginalClass(Object obj) {
    Class<?> cls = obj.getClass();
    return cls.isAnonymousClass()
            ? cls.getInterfaces().length == 0 ? cls.getSuperclass() : cls.getInterfaces()[0]
            : cls;
}

答案 1 :(得分:1)

你正在做的是获得超类是正确的。但是Runnable是一个界面,这就是它无法运作的原因。 请查看有关如何获取所有接口的答案:Get all interfaces

答案 2 :(得分:1)

正如其他人提到的那样,runnable是一个接口,所以你不能使用getClass方法来获取它的名字。但是你可以这样做:

System.out.println(obj.getClass().getInterfaces()[0].getName())

注意getInterfaces返回一个数组,所以如果你实现了多个数组,你必须用for循环遍历它。