Class.forName()用法详解

更新时间:2023-07-20 20:30:59 阅读: 评论:0

Class.forName()⽤法详解
主要功能
Class.)返回的是⼀个类
Class.)的作⽤是要求JVM查找并加载指定的类,
也就是说JVM会执⾏该类的静态代码段
下⾯,通过解答以下三个问题的来详细讲解下Class.forName()的⽤法。
⼀.什么时候⽤Class.forName()?
先来个热⾝,给你⼀个字符串变量,它代表⼀个类的包名和类名,你怎么实例化它?你第⼀想到的肯定是new,但是注意⼀点:
A a = (A)Class.forName(“pacage.A”).newInstance();
郑州化妆师培训这和你 A a = new A();是⼀样的效果。
百度英汉互译
现在⾔归正传。
动态加载和创建Class 对象,⽐如想根据⽤户输⼊的字符串来创建对象时需要⽤到:
String str = “⽤户输⼊的字符串” ;
Class t = Class.forName(str);微信支持修改微信号
在初始化⼀个类,⽣成⼀个实例的时候,newInstance()⽅法和new关键字除了⼀个是⽅法,⼀个是关键字外,最主要有什么区别?它们的区别在于创建对象的⽅式不⼀样,前者是使⽤类加载机制,后者是创建⼀个新类。那么为什么会有两种创建对象⽅式?这主要考虑到软件的可伸缩、可扩展和可重⽤等软件设计思想。
中⼯⼚模式经常使⽤newInstance()⽅法来创建对象,因此从为什么要使⽤⼯⼚模式上可以找到具体答案。例如:教师节手抄报的内容
class c = Class.forName(“Example”);
factory = (wInstance();
其中ExampleInterface是Example的接⼝,可以写成如下形式:
String className = “Example”;
class c = Class.forName(className);
factory = (wInstance();
进⼀步可以写成如下形式:
sca杨桃的英文String className = readfromXMlConfig;//从xml 配置⽂件中获得字符串
class c = Class.forName(className);
factory = (wInstance();
上⾯代码已经不存在Example的类名称,它的优点是,⽆论Example类怎么变化,上述代码不变,甚⾄可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。
从JVM的⾓度看,我们使⽤关键字new创建⼀个类的时候,这个类可以没有被加载。但是使⽤newInstance()⽅法的时候,就必须保证:
1、这个类已经加载;
2、这个类已经连接了。
⽽完成上⾯两个步骤的正是Class的静态⽅法forName()所完成的,这个静态⽅法调⽤了启动类加载器,即加载 API的那个加载器。
现在可以看出,newInstance()实际上是把new这个⽅式分解为两步,即⾸先调⽤Class加载⽅法加载某个类,然后实例化。这样分步的好处是显⽽易见的。我们可以在调⽤class的静态加载⽅法forName时获得更好的灵活性,提供给了⼀种降耦的⼿段。
⼆.new 和Class.forName()有什么区别?
其实上⾯已经说到⼀些了,这⾥来做个总结:
汉语拼音口语练习⾸先,newInstance( )是⼀个⽅法,⽽new是⼀个关键字;
其次,Class下的newInstance()的使⽤有局限,因为它⽣成对象只能调⽤⽆参的构造函数,⽽使⽤ new关键字⽣成对象没有这个限制。
简⾔之:
newInstance(): 弱类型,低效率,只能调⽤⽆参构造。
new: 强类型,相对⾼效,能调⽤任何public构造。
Class.forName(“”)返回的是类。
Class.forName(“”).newInstance()返回的是object 。
三.为什么在加载驱动包的时候有⽤的是Class.forName( ),却没有调⽤newInstance( )?
在Java开发特别是数据库开发中,经常会⽤到Class.forName( )这个⽅法。
通过查询Java Documentation我们会发现使⽤Class.forName( )静态⽅法的⽬的是为了动态加载类。
通常编码过程中,在加载完成后,⼀般还要调⽤Class下的newInstance( )静态⽅法来实例化对象以便操作。因此,单单使⽤Class.forName( )是动态加载类是没有⽤的,其最终⽬的是为了实例化对象。
有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调⽤newInstance( )⽅法呢?
即有的jdbc连接数据库的写法⾥是Class.);⽽有⼀些:Class.).ne
wInstance(),为什么会有这两种写法呢?
刚才提到,Class.forName(“”);的作⽤是要求JVM查找并加载指定的类,⾸先要明⽩,java⾥⾯任何class都要装载在虚拟机上才能运⾏,⽽静态代码是和class绑定的,class装载成功就表⽰执⾏了你的静态代码了,⽽且以后不会再⾛这段静态代码了。
spellbound
⽽我们前⾯也说了,Class.)的作⽤就是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执⾏
该类的静态代码段。
⽽在JDBC规范中明确要求这个Driver类必须向DriverManager注册⾃⼰,即任何⼀个JDBC Driver的 Driver类的代码都必须类似如下:public class MyJDBCDriver implements Driver {
static {
}
}
既然在静态初始化器的中已经进⾏了注册,所以我们在使⽤JDBC时只需要Class.forName(XXX.XXX);就可以了。
tear gas
相关英⽂参考⽂献如下:
we just want to load the driver to jvm only, but not need to ur the instance of driver,
so call Class.) is enough, if you call Class.).newInstance(),
the result will same as calling Class.),
becau Class.).newInstance() will load driver first,
and then create instance, but the instacne you will never u in usual,
so you need not to create it.
peter pan

本文发布于:2023-07-20 20:30:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/183572.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:英语作文2
标签:加载   代码   静态   字符串   数据库   创建
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图