Java“ Class.forName()”和“ Class.forName()newInstance()”之间有什么区别?

简介: Java“ Class.forName()”和“ Class.forName()newInstance()”之间有什么区别?

如何解决Java“ Class.forName()”和“ Class.forName()newInstance()”之间有什么区别??
也许一个示例演示如何使用两种方法将有助于你更好地理解事物。因此,请考虑以下类:

package test;
public class Demo {

public Demo() {
    System.out.println("Hi!");
}
public static void main(String[] args) throws Exception {
    Class clazz = Class.forName("test.Demo");
    Demo demo = (Demo) clazz.newInstance();
}

}
如其javadoc中所述,调用将返回与具有给定字符串名称的类或接口关联的对象,即它返回受type变量影响的对象。Class.forName(String) Classtest.Demo.classclazzClass

然后,调用创建该 对象表示的类的新实例。就像通过带有空参数列表的表达式实例化该类。换句话说,这实际上等于a 并返回的新实例。clazz.newInstance() Classnewnew Demo()Demo

Demo因此,运行此类将输出以下输出:

Hi!
与传统的最大区别new在于,它newInstance可以实例化一个直到运行时才知道的类,从而使代码更具动态性。

一个典型的示例是JDBC API,它在运行时加载执行工作所需的确切驱动程序。EJB容器,Servlet容器是另一个很好的例子:它们使用动态运行时加载来加载和创建在运行时之前一无所知的组件。

实际上,如果你想走得更远,请看一下Ted Neward的论文《理解Class.forName()》,我在上一段中对此进行了解释。

编辑(从发表为评论的OP中回答问题):JDBC驱动程序的情况有点特殊。如《 JDBC API入门》中DriverManager章节所述:

(…)Driver加载了一个类,因此通过以下DriverManager两种方式之一自动向进行注册:

通过调用方法Class.forName。这将显式加载驱动程序类。由于它不依赖任何外部设置,因此推荐使用这种加载驱动程序的方式来使用该DriverManager 框架。以下代码加载该类acme.db.Driver:
Class.forName("acme.db.Driver");
如果acme.db.Driver编写了这样的代码以便加载它会导致创建一个实例,并且还 DriverManager.registerDriver以该实例作为参数进行调用(应该这样做),则它在 DriverManager驱动程序列表中,可用于创建连接。

(...)
在这两种情况下,新加载的Driver类都有责任通过调用进行注册DriverManager.registerDriver。如前所述,这应该在加载类时自动完成。

为了在初始化期间注册自己,JDBC驱动程序通常使用一个静态初始化块,如下所示:

package acme.db;
public class Driver {

static {
    java.sql.DriverManager.registerDriver(new Driver());
}
...

}
调用Class.forName(“acme.db.Driver”)会导致acme.db.Driver类的初始化,并因此导致静态初始化块的执行。并且 Class.forName(“acme.db.Driver”)确实会“创建”一个实例,但这只是实现(良好)JDBC驱动程序的结果。

解决方法
Class.forName()和之间有什么区别Class.forName().newInstance()?

我不了解其中的重大区别(我已经阅读了一些有关它们的信息!)。请你帮助我好吗?
声明:地推任务网所有作品(图片、文字)均由用户自行上传分享,仅供网友学习交流。

相关文章
|
6天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
14天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
26天前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
20 1
|
30天前
|
Java 编译器 C语言
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
36 2
|
30天前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
31 1
|
17天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
19天前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
48 0
|
12天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
91 38
|
9天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
4天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####