1

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

4

2 回答 2

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

于 2012-09-09T08:06:24.537 回答
1

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

于 2012-09-09T08:05:39.570 回答