Class.forName("org.MyClass")
并且MyClass.class
都需要类名。那么,当我们Class.forName("org.MyClass")
在编译时不知道类名的情况下MyClass.class
使用,而在我们知道类名的情况下使用,这是什么意思呢?
这些与 有何不同obj.getClass()
?
Class.forName("org.MyClass")
并且MyClass.class
都需要类名。那么,当我们Class.forName("org.MyClass")
在编译时不知道类名的情况下MyClass.class
使用,而在我们知道类名的情况下使用,这是什么意思呢?
这些与 有何不同obj.getClass()
?
MyClass.class
在编译时通常被认为是给定的类。
obj.getClass()
当一个对象是已知的但不知道它的类时,或者如果该对象是一个可定义的泛型类型,则使用它来获取一个类。
Class.forName("org.YourClass")
如果您知道类的名称(即名称通过网络传递或以其他方式作为字符串获得)而没有类的实例,或者在编译时已知类的标识,则需要。
您自己已经给出了答案:当您使用 时MyClass.class
,编译器需要知道是什么MyClass
,因此您需要MyClass
在编译时将其放入类路径中;而当您使用 时Class.forName("org.MyClass")
,该类在编译时不需要位于类路径中 - 仅在运行时。
这例如用于 JDBC 驱动程序。您编写代码以使用 JDBC API,但无需在编译时指定要使用的 JDBC 驱动程序。这也允许您切换到另一个 JDBC 驱动程序,而无需重新编译您自己的代码。
obj.getClass()
获取 的Class
对象obj
。
MyClass.class
:
Class<MyClass>
,因此newInstance()
返回MyClass
。Class.forName("org.MyClass")
:
Class<MyClass>
,而是Class<?>
因此newInstance()
返回Object
。ClassNotFoundException
抛出需要处理的已检查异常。Class.forName("org.MyClass") equal to MyClass
MyClass.class equal to Class<MyClass>
与MyClass.class
您在编译时获得类。
并Class.forName("org.MyClass")
在运行时使用。
您通常将值传递给 Class#forName 并且不要对字符串进行硬编码。如果它是硬编码的,则使用.class