我们可以通过 3 种方法获取类 Class 对象:
- MyClass.class
- obj.getClass
- Class.forName("className")
我不明白:MyClass.class
和之间的区别Class.forName("className")
。
因为两者都需要类名。
我们可以通过 3 种方法获取类 Class 对象:
我不明白:MyClass.class
和之间的区别Class.forName("className")
。
因为两者都需要类名。
Class.forName("className");
forName 是类“Class”的静态方法。我们需要提供所需类的完全限定名称。这可以在运行时知道类的名称时使用。
ClassName.class;
.class 不是方法,它是关键字,可以与 int 等原始类型一起使用。当提前知道类的名称并将其添加到项目中时,我们使用 ClassName.class
我不明白:
MyClass.class
和之间的区别Class.forName("className")
。因为两者都需要类名。
最大的区别在于他们何时需要它。由于Class.forName
接受string,因此可以在运行时确定类名。而当然,MyClass.class
是在编译时确定的。这Class.forName
对于基于配置动态加载类非常有用(例如,根据配置文件的设置加载数据库驱动程序)。
四舍五入:obj.getClass()
很有用,因为您可能不知道对象的实际类 - 例如,在您使用接口而不是类接受参数的方法中,例如 in foo(Map m)
。你不知道 的类m
,只是它是实现的东西Map
。(而且 99% 的情况下,你不应该关心它的类是什么,但那 1% 偶尔会出现。)
一个重要的区别是:A.class 将执行类 A 的加载和链接。 Class.forName("A") 将执行类 A 的加载、链接和初始化。
Class.forName("className");
它根据完全限定的类名字符串动态加载类。
obj.getClass
返回表示对象的运行时类的 java.lang.Class 对象。
MyClass.class:
字面量是由类、接口、数组或原始类型或伪类型 void 的名称组成的class
表达式,后跟a
“.”。和令牌类。的类型C.class
,其中 C 是类、接口或数组类型的名称是Class<C>
。