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驱动程序的结果。
问题内容: 我在Netbeans 7.2上遇到此错误,它说ClassNotFoundexception和InstantationException。我真的在这个问题上陷入困境。请帮助我。 问题答案: 那么这个简单的方法呢? 我也想知道为什么您要用这种方式连接数据库?最好让服务器对其进行管理。 首先像这样配置(如果您使用的是tomcat): 然后,简单地从servlet / etc中的该资源获取连接
问题内容: 连接到MySQL数据库时,请执行以下步骤 实际上,我想知道语句的作用。 虽然此类不在mysql.jar中。它在哪里? 问题答案: 本类位于java.lang包,因此在分布用java,并自动导入到每个班级。 该方法所做的只是返回由类加载器加载的参数对象。然后,该方法返回该类的新实例。 因此,发生什么情况是您称之为 返回com.mysql.jdbc.Driver.class。然后,您调用该
问题内容: 我们可以通过3种方法获得Class类对象: MyClass.class obj.getClass Class.forName(“ className”) 我不了解:和之间的区别。 因为两者都需要类名。 问题答案: forName是“类”类的静态方法。我们需要提供所需类别的完全限定名称。当在运行时知道类名时可以使用此方法。 .class不是方法,它是关键字,可以与int之类的原始类型一起
问题内容: 我想了解Class.forName(“ ClassName”)和ClassObject.getClass是否都返回该类的运行时实例。然后为什么在比较从这两个对象获得的结果Class对象时获取一个布尔值false(如果我们使用==或equals进行比较)。 我也想知道在类名上调用.class方法的确切用途。我读到它是在编译时等确定的,但目的是什么。Class.forName(“ Clas
问题内容: 以下是2个代码段 第一个使用ClassLoader类加载指定的类 第二个使用Class.forName()加载指定的类 上述方法之间有何区别?哪一个服务于哪个目的? 问题答案: 快速解答(无代码示例) 使用显式方法,您可以灵活地从 不是 默认ClassLoader的ClassLoader中加载类。在你的情况下,你使用的是默认系统类加载器,所以它提供了类似的总体结果(与最终目标的差异的实
问题内容: 我正在尝试使用SQLite数据库创建一个简单的应用程序。我选择使用SQLiteJDBC驱动程序。 以下代码取自上述网站。我的问题是关于公共static void main之后的行… 内容为: 我的问题是,这行是什么意思?它是做什么的?它似乎没有与其余代码关联。应该返回一个类,但该行似乎在人体内部独立存在。我可以看到,返回的任何内容都未被代码的另一部分使用。 请帮助澄清这一点。提前致谢。