1

Class.forName("org.MyClass")并且MyClass.class都需要类名。那么,当我们Class.forName("org.MyClass")在编译时不知道类名的情况下MyClass.class使用,而在我们知道类名的情况下使用,这是什么意思呢?

这些与 有何不同obj.getClass()

4

5 回答 5

4

MyClass.class在编译时通常被认为是给定的类。

obj.getClass()当一个对象是已知的但不知道它的类时,或者如果该对象是一个可定义的泛型类型,则使用它来获取一个类。

Class.forName("org.YourClass")如果您知道类的名称(即名称通过网络传递或以其他方式作为字符串获得)而没有类的实例,或者在编译时已知类的标识,则需要。

于 2013-11-07T12:17:29.557 回答
1

您自己已经给出了答案:当您使用 时MyClass.class,编译器需要知道是什么MyClass,因此您需要MyClass在编译时将其放入类路径中;而当您使用 时Class.forName("org.MyClass"),该类在编译时不需要位于类路径中 - 仅在运行时。

这例如用于 JDBC 驱动程序。您编写代码以使用 JDBC API,但无需在编译时指定要使用的 JDBC 驱动程序。这也允许您切换到另一个 JDBC 驱动程序,而无需重新编译您自己的代码。

obj.getClass()获取 的Class对象obj

于 2013-11-07T12:19:03.563 回答
0

MyClass.class

  • 可以分配给Class<MyClass>,因此newInstance()返回MyClass
  • 如果类路径中不存在该类,则编译失败。
  • 不抛出任何已检查的异常。

Class.forName("org.MyClass")

  • 不能分配给Class<MyClass>,而是Class<?>因此newInstance()返回Object
  • 即使类路径中不存在该类,编译也会成功。
  • ClassNotFoundException抛出需要处理的已检查异常。
于 2013-11-07T12:29:07.393 回答
0
Class.forName("org.MyClass") equal to MyClass

MyClass.class equal to Class<MyClass>
于 2013-11-07T12:26:25.797 回答
0

MyClass.class您在编译时获得类。

Class.forName("org.MyClass")在运行时使用。

您通常将值传递给 Class#forName 并且不要对字符串进行硬编码。如果它是硬编码的,则使用.class

于 2013-11-07T12:28:29.073 回答