Class.forName(“org.MyClass”)和MyClass.class的区别

时间:2013-11-07 12:15:11

标签: java reflection

Class.forName("org.MyClass")MyClass.class都需要类名。那么,当我们在编译时不知道类的名称时使用Class.forName("org.MyClass")时会出现什么意思,当我们知道类的名称时会使用MyClass.class

这些与obj.getClass()有什么不同?

5 个答案:

答案 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