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