getClass()对java中匿名接口的refrance给出了类名

时间:2016-04-21 09:57:06

标签: java interface

在我下面提到的情况中,我在普通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。

3 个答案:

答案 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.FooinstanceOf运算符返回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;

}