【问题标题】:Distinction between ClassObject.getClass,ClassName.class and Class.forName("ClassName")ClassObject.getClass,ClassName.class 和 Class.forName("ClassName") 的区别
【发布时间】:2012-09-02 11:29:07
【问题描述】:

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

【问题讨论】:

  • Class.forName("ClassName") 在运行时尝试解析,如果找不到则抛出异常,而ClassName.class 将阻止类通过验证或完全编译。

标签: java class classname


【解决方案1】:

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

【讨论】:

    【解决方案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() 返回 @987654327 @,即b的动态类对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2021-11-20
      • 2012-02-21
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 2018-03-21
      相关资源
      最近更新 更多