Java MyClass.class和class.forName之间的差异(“className”)

Java MyClass.class和class.forName之间的差异(“className”),java,reflection,Java,Reflection,我们可以通过3种方法获得类对象: 我的班级 对象类 Class.forName(“className”) 我不明白:MyClass.class和class.forName(“className”)之间的区别 因为两者都需要类名 Class.forName("className"); forName是类“class”的静态方法。 我们需要提供所需类的完全限定名。 当类名在运行时为人所知时,可以使用此选项 ClassName.class; .class不是一个方法,它是一个关键字,可以与i

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

  • 我的班级
  • 对象类
  • Class.forName(“className”)
我不明白:
MyClass.class
class.forName(“className”)
之间的区别

因为两者都需要类名

Class.forName("className"); 
forName是类“class”的静态方法。 我们需要提供所需类的完全限定名。 当类名在运行时为人所知时,可以使用此选项

ClassName.class;
.class不是一个方法,它是一个关键字,可以与int等基元类型一起使用。 当类的名称被预先知道并添加到项目中时,那个么我们就使用ClassName.Class

我不明白:
MyClass.class
class.forName(“className”)
之间的区别

因为两者都需要类名

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

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

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

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

MyClass.class:
class
literal是由类、接口、数组的名称组成的表达式, 或基元类型,或伪类型void,后跟
a
'.'和标记类。
C.class
的类型,其中C是类的名称,接口或数组类型是
class


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

或者,简而言之:运行时查找与编译时查找。Class不是关键字。MyClass.Class不会导致运行时查找的各种答案中的建议或含义的可能重复项为false。当包含引用的类正在加载时,它只会导致更早的运行时查找!查找失败对加载是致命的。很好的解释