ClassObject.getClass,ClassName.class和Class.forName(“ClassName”)之间的区别

时间:2012-09-09 07:58:29

标签: java class classname

我希望了解Class.forName(“ClassName”)和ClassObject.getClass 返回类的运行时实例。那么为什么在比较从两个读取中获得的结果Class对象时我们得到一个布尔值false(如果我们使用==或equals进行比较)。
    我也想知道在类名上调用的.class方法的确切用法是什么。我已经读过它是在编译时确定的,但是用于什么目的。 Class.forName(“ClassName”)不会足够吗?
感谢

2 个答案:

答案 0 :(得分:2)

是的,它们是相同的 - 它们返回完全相同的对象。

示例:

public class Tryout {
    public static class A {     
    }
    public static class B extends A {   
    }
    public static void main(String[] args) throws Exception {
        A a = new A();
        A b = new B();
        //the same class object, one achieved statically and one dynamically.
        System.out.println(a.getClass() == A.class);
        //the same class object using forName() to get class name dynamically 
        System.out.println(Class.forName("Tryout$A") == A.class);
        //different class. B is not A!
        System.out.println(b.getClass() == A.class);
    }
}

将屈服:

true
true
false

请注意,最后一个产生false因为 - 虽然静态类型是相同的,但B的动态类型不是A,因此getClass()返回B,它是b的动态类对象。

答案 1 :(得分:1)

Class.forName加载并初始化类。 obj.getClass()返回加载到permgen中的类对象。如果该类由同一个类加载器==加载,则必须返回true。当您看到false ==比较时,意味着它们由不同的类加载器加载。