Class.forName("org.MyClass")
和MyClass.class
都需要类名。那么,当我们在编译时不知道类的名称时使用Class.forName("org.MyClass")
时会出现什么意思,当我们知道类的名称时会使用MyClass.class
?
这些与obj.getClass()
有什么不同?
答案 0 :(得分:4)
MyClass.class
通常在编译时被称为给定类。
obj.getClass()
用于一个对象已知但不是它的类,或者如果该对象是一个可反用的泛型类型,则用于获取一个类。
Class.forName("org.YourClass")
时间。
答案 1 :(得分:1)
您已经自己给出了答案:当您使用MyClass.class
时,编译器需要知道MyClass
是什么,因此您需要在编译时在类路径中使用MyClass
时间;而当你使用Class.forName("org.MyClass")
时,类在编译时不需要在类路径中 - 只在运行时。
这用于JDBC驱动程序。编写代码以使用JDBC API,但是您不需要在编译时指定要使用的JDBC驱动程序。这也允许您切换到另一个JDBC驱动程序,而无需重新编译自己的代码。
obj.getClass()
获取Class
的{{1}}对象。
答案 2 :(得分:0)
Class.forName("org.MyClass") equal to MyClass
MyClass.class equal to Class<MyClass>
答案 3 :(得分:0)
使用MyClass.class
,您可以在编译时获得该类。
并且在运行时使用Class.forName("org.MyClass")
。
您正常地将值传递给Class#forName并且不对字符串进行硬编码。如果它是硬编码的,请使用.class
答案 4 :(得分:0)
MyClass.class
:
Class<MyClass>
,因此newInstance()
会返回MyClass
。 Class.forName("org.MyClass")
:
Class<MyClass>
,而是Class<?>
,因此newInstance()
会返回Object
。ClassNotFoundException
。