MyClass.class和Class.forName("className")之间的区别是什么?

7
我们可以通过三种方法获得类的Class对象:
  • MyClass.class
  • obj.getClass()
  • Class.forName("className")
我不明白这两者之间的区别:MyClass.classClass.forName("className")。因为它们都需要类名。

可能是调用MyClass.class和MyClass.getClass()有什么区别?的重复问题。 - Mohammed Azharuddin Shaikh
各种答案中提出的建议或暗示,即 MyClass.class 不会导致运行时查找是错误的。它只会在包含引用的类加载时导致更早的运行时查找!并且查找失败对该加载是致命的。 - user207421
4个回答

11
Class.forName("className"); 

forName是"Class"类的一个静态方法。我们需要提供所需类的完全限定名称。当在运行时才知道类名时,可以使用此方法。

ClassName.class;

.class 不是一个方法,它是一个关键字,并且可以与原始类型(如 int)一起使用。 当类的名称已知并且在项目中被添加时,我们使用 ClassName.class


7
或者简单说:运行时查找与编译时查找。 - Mario The Spoon
.class不是一个关键字。 - user207421

8
我不理解MyClass.classClass.forName("className")之间的区别,因为两者都需要类名。
它们的主要区别在于获取类名的时间。由于Class.forName接受一个字符串,所以类名可以在运行时确定。而当然,MyClass.class是在编译时确定的。这使得Class.forName在根据配置动态加载类时非常有用(例如,根据配置文件的设置加载数据库驱动程序)。
补充一下:obj.getClass()很有用,因为您可能不知道对象的实际类——例如,在接受使用接口而不是类作为参数的方法中,例如foo(Map m)。您不知道m的类,只知道它是实现Map的某些东西。 (99%的时间,您不应该关心它的类是什么,但是偶尔会出现1%的情况。)

很好的解释 - vijaya kumar

2
Class.forName("className"); 

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

obj.getClass

返回代表对象运行时类的java.lang.Class对象。
MyClass.class:

一个类字面量是由一个类、接口、数组或基本类型的名称,或伪类型void,后跟a '.' 和令牌class组成的表达式。其中C是类、接口或数组类型的名称,C.class的类型是Class<C>http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接