【问题标题】:Difference between MyClass.class and Class.forName("className")MyClass.class 和 Class.forName("className") 之间的区别
【发布时间】:2014-08-28 14:31:58
【问题描述】:

我们可以通过3种方法获取类Class对象:

  • MyClass.class
  • obj.getClass
  • Class.forName("className")

我不明白MyClass.classClass.forName("className") 之间的区别。

因为两者都需要类名。

【问题讨论】:

标签: java reflection


【解决方案1】:
Class.forName("className"); 

forName 是类“Class”的静态方法。 我们需要提供所需类的完全限定名称。 这可以在类名在运行时知道时使用。

ClassName.class;

.class 不是方法,它是关键字,可以与 int 等原始类型一起使用。 当事先知道类的名称并将其添加到项目中时,我们使用 ClassName.class

【讨论】:

  • 或者,简而言之:运行时查找与编译时查找
  • .class 不是关键字。
【解决方案2】:

我不明白MyClass.classClass.forName("className") 之间的区别。

因为两者都需要类名。

最大的区别是何时他们需要它。由于Class.forName 接受字符串,因此类名可以在运行时确定。当然,MyClass.class 是在编译时确定的。这使得Class.forName 可用于根据配置动态加载类(例如,根据配置文件的设置加载数据库驱动程序)。

四舍五入:obj.getClass() 很有用,因为您可能不知道对象的实际类 - 例如,在使用接口而不是类接受参数的方法中,例如在 foo(Map m) 中。你不知道m 的类,只是它实现了Map。 (而且 99% 的情况下,你不应该关心它的类是什么,但那 1% 偶尔会出现。)

【讨论】:

  • 很好的解释
【解决方案3】:

一个重要的区别是: A.class 将执行类 A 的加载和链接。 Class.forName("A") 将执行类 A 的加载、链接和初始化。

【讨论】:

    【解决方案4】:
    Class.forName("className"); 
    

    它根据完全限定的类名字符串动态加载类。

    obj.getClass
    

    返回表示对象的运行时类的 java.lang.Class 对象。

    MyClass.class:
    

    class 文字是由类名、接口名、数组名组成的表达式, 或原始类型,或伪类型 void,后跟a'。和令牌类。 C.class 的类型,其中 C 是类、接口或数组类型的名称是 Class<C>

    http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2011-01-06
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      相关资源
      最近更新 更多