Class.forName()
和 Class.forName().newInstance()
有什么区别?
我不明白其中的显着差异(我读过一些关于它们的资料!)。请你帮助我好吗?
原文由 Johanna 发布,翻译遵循 CC BY-SA 4.0 许可协议
Class.forName()
和 Class.forName().newInstance()
有什么区别?
我不明白其中的显着差异(我读过一些关于它们的资料!)。请你帮助我好吗?
原文由 Johanna 发布,翻译遵循 CC BY-SA 4.0 许可协议
Class.forName() 为您提供类对象,这对反射很有用。该对象具有的方法是由 Java 定义的,而不是由编写该类的程序员定义的。每个班级都一样。调用 newInstance() 给你那个类的一个实例(即调用 Class.forName("ExampleClass").newInstance()
它相当于调用 new ExampleClass()
),你可以调用类定义的方法,访问可见域等
原文由 Thomas Lötzer 发布,翻译遵循 CC BY-SA 2.5 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
也许一个演示如何使用这两种方法的示例将帮助您更好地理解事物。因此,请考虑以下课程:
正如其 javadoc 中所述,调用
Class.forName(String)
返回Class
与具有给定字符串名称的类或接口关联的对象, 即它返回test.Demo.class
clazz
变量类型Class
。然后,调用
clazz.newInstance()
创建由这个Class
对象表示的类的新实例。该类被实例化,就好像是通过带有空参数列表的new
表达式一样。 换句话说,这实际上相当于new Demo()
并返回Demo
的新实例。运行这个
Demo
类会打印以下输出:与传统的
new
的最大区别在于newInstance
允许实例化一个你直到运行时才知道的类,使你的代码更加动态。一个典型的例子是 JDBC API,它在运行时加载执行工作所需的确切驱动程序。 EJB 容器、Servlet 容器是其他很好的例子:它们使用动态运行时加载来加载和创建它们在运行时之前一无所知的组件。
实际上,如果您想更进一步,请查看我在上面段落中解释的 Ted Neward 论文 Understanding Class.forName() 。
编辑(回答作为评论发布的 OP 的问题):JDBC 驱动程序的情况有点特殊。正如 JDBC API 入门 的 DriverManager 一章中所述:
public class Driver {
}
”`
调用
Class.forName("acme.db.Driver")
导致acme.db.Driver
类的初始化,从而执行静态初始化块。并且Class.forName("acme.db.Driver")
确实会“创建”一个实例,但这只是(良好的)JDBC 驱动程序实现方式的结果。作为旁注,我要提到 JDBC 4.0(自 Java 7 以来作为默认包添加)和 JDBC 4.0 驱动程序的新自动加载功能不再需要所有这些。请参阅 Java SE 6 中的 JDBC 4.0 增强功能。