在我下面提到的情况中,我在普通refrance上使用instanceof和getClass()时得到两个不同的o / p。 我有一个Interface Foo。
public interface Foo { void dispaly();}
使用匿名块技术将正文放在另一个类的display();
中。
public class ClassWithMainMethod {
public static void main(String[] args) throws Exception{
Foo obj = new Foo(){
@Override
public void dispaly() {System.out.println("msg");}
};
System.out.println(obj instanceof Foo); // result: true
System.out.println(obj.getClass());//result com.ClassWithMainMethod$1
obj.dispaly(); // result: msg
}}
现在在obj.getClass
,为什么我没有把com.Foo作为o / p。
答案 0 :(得分:0)
这段代码
Foo obj = new Foo(){
@Override
public void dispaly() {System.out.println("msg");}
};
创建一个实现接口Foo
的匿名类。生成的匿名类与com.Foo
不同,并且没有它的名称。在编译期间,匿名类将根据其包含的类给出名称。格式为<containing class name>$<identifier>
。
您的包含类是ClassWithMainMethod
,您的类是第一个内部的匿名类,因此生成的名称为com.ClassWithMainMethod$1
。由于此类实现com.Foo
,instanceOf
运算符返回true
,您可以调用display()
方法。
答案 1 :(得分:0)
getClass()总是返回运行时类,即com.ClassWithMainMethod $ 1
答案 2 :(得分:0)
您可以使用此方法来确定匿名类的超类或超级接口:
static Class<?> getAnonymousClass(Object o){
Class<?> superClass=o.getClass().getSuperclass();
Class<?>[] superInterface=o.getClass().getInterfaces();
return superClass!=java.lang.Object.class?superClass:
superInterface.length>0?superInterface[0]:java.lang.Object.class;
}