7

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

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

我不明白:MyClass.class和之间的区别Class.forName("className")

因为两者都需要类名。

4

4 回答 4

11
Class.forName("className"); 

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

ClassName.class;

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

于 2012-06-18T04:49:34.267 回答
8

我不明白:MyClass.class和之间的区别Class.forName("className")

因为两者都需要类名。

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

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

于 2012-06-18T04:53:25.500 回答
2

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

于 2014-08-28T06:31:58.287 回答
1
Class.forName("className"); 

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

obj.getClass

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

MyClass.class:

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

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

于 2012-06-18T05:35:37.913 回答