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