我无法弄清楚如何获得定义匿名内部类的原始抽象类或接口。
例如:
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
)
答案 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循环遍历它。