ClassObject.getClass,ClassName.class和的Class.forNam

2019-06-28 02:02发布

我想知道如果这两个的Class.forName(“类名”)和类的ClassObject.getClass返回运行时实例。 那么,为什么在比较从获得的两个结果Class对象获取我们一个布尔值false(如果我们比较使用==还是equals)。
我也想知道什么是确切使用号召类name.I的.class方法都读过这是在编译时等,但要达到什么目的来确定。 不会的Class.forName(“类名”)就足够了?
谢谢

Answer 1:

Class.forName加载并初始化类。 obj.getClass()返回装入PermGen的类对象。 如果类是由同一个类加载器加载==必须返回true。 当你看到false的==比较这意味着它们是由不同的类加载器加载。



Answer 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



文章来源: Distinction between ClassObject.getClass,ClassName.class and Class.forName(“ClassName”)