MyClass.class和Class.forName(“className”)之间的区别

时间:2012-06-18 04:47:52

标签: java reflection

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

  • MyClass.class
  • obj.getClass
  • 的Class.forName( “类名”)

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

因为两者都需要类名。

4 个答案:

答案 0 :(得分:11)

Class.forName("className"); 

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

ClassName.class;

.class不是一个方法,它是一个关键字,可以像int一样使用原始类型。 当班级名称事先知道时它被添加到项目中,那时我们使用ClassName.class

答案 1 :(得分:8)

  

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

     

因为两者都需要类名。

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

解决问题:obj.getClass()非常有用,因为您可能不知道对象的实际类 - 例如,在使用接口而不是类接受参数的方法中,例如在{{ 1}}。你不知道foo(Map m)的类,只是它是实现m的东西。 (99%的时候,你不应该关心它的课程是什么,但偶尔会增加1%。)

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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