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()?

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

相关文章
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
82 14
|
28天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
22 1
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
58 8
|
2月前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
3月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
3月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
3月前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
104 0
|
7天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
9天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
9天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。