我想知道如果这两个的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”)