`
mars914
  • 浏览: 430659 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java下Class.forName详解

阅读更多
Class.forName(xxx.xx.xx) 返回的是一个类

首先,要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。
考虑一下这个问题:什么时候用?给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?

就要提到的这个方法了,不过要再加一点。
A a = (A)Class.forName("pacage.A").newInstance();
这和你
A a = new A();
是一样的效果。

补充:

静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。

static{

......

}

Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象
String str = 用户输入的字符串
Class t = Class.forName(str);
t.newInstance();
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?
区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。

Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:
class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的接口,可以写成如下形式:
String className = "Example";
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();
进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
分享到:
评论
2 楼 西门大官人 2011-11-19  
受教。。。。。。。。。。
1 楼 xchd 2011-11-07  
学习了。。。。。。

相关推荐

    java中Class.forName方法的作用详解

    Class.forName(xxx.xx.xx) 返回的是一个类,但Class.forName方法的作用到底...下面这篇文章就来给大家详细介绍了关于java中Class.forName方法的作用,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

    java反射详解

    demo=Class.forName("Reflect.Person"); }catch (Exception e) { e.printStackTrace(); } Person per=null; try { per=(Person)demo.newInstance(); } catch (InstantiationException e) { // TODO Auto-...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JDBC详解HTML-JDBC.pp

    <2>.Class.forName(driver).newInstance() <3>.new driver() 2>.取得数据库连接(Connect to the DataBase) <1>.用DriverManager取数据库连接 Connection cn = DriverManager.getConnection(url,uid,pwd); <2>....

    Java开发中连接数据库的方法和详解

     在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。  例如:  try{  //加载MySql的驱动类  Class.forName(...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.5.3 Java类库(Java Class Libraries) 17 1.5.4 Java虚拟机(Java Virtual Machine) 17 1.5.5 HelloWorld的整个流程 17 1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的...

    java开发环境搭建详解

    Java 开发环境搭建详解 在 Java 开发中,环境搭建是第一步,也是最重要的一步。本文将详细介绍 Java 开发环境搭建的步骤,包括 JDK 的安装和配置、Tomcat 的安装和配置、Eclipse 的安装和配置等。 一、JDK 安装与...

    Derby和Sqlite数据库配置与使用.pdf

    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");//加载驱动 conn = DriverManager.getConnection("jdbc:derby:dd;create=true"); System.out.println("连接成功"); } //数据库表中内容的增删改 ...

    多线程详解

    Java线程:概念与原理 一、操作系统中线程和进程的概念 二、Java中的线程 三、例子 /** * 实现Runnable接口的类 * * @author leizhimin 2008-9-13 18:12:10 */ public class DoSomething implements Runnable...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.5.3 Java类库(Java Class Libraries) 17 1.5.4 Java虚拟机(Java Virtual Machine) 17 1.5.5 HelloWorld的整个流程 17 1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的...

    J2EE应用开发详解

    29 3.2.2 Class.forName()加载类的实例 30 3.2.3 loadClass获得类的实例 31 3.3 操作类的字段 31 3.3.1 获取对象的属性 31 3.4 操作类的方法 34 3.4.1 运行时调用对象的方法 34 3.4.2 无参构造函数 36 3.4.3 带参...

    java 编写文件上传类简单易用

    用 Java 编写的、协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于 Java 的服务器解决方案。本文将从文件传输的基本原理入手,分析如何用 java进行文件的上传,并提出解决方案。 一、基本...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【反射】反射中,Class.forName和classloader的区别 42 【JVM】JAVA编译原理和JVM原理 42 【JVM】Java内存模型 44 【JVM】jvm内存模型 45 主内存与工作内存 45 内存间交互操作 46 重排序 48 【JVM】内存泄漏 49 ...

    2、webservice--常用注解1

    在 Java 中,WebService 通常使用 JAX-WS(Java API for XML-Based Web Services)实现。今天,我们将详细介绍常用注解的使用。 首先,让我们看看基本的@WebService 注解。@WebService 注解用于标注一个类为...

    spring chm文档

    Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright...

    jpivot学习总结.doc

    allLevelName 所有级别的名字,它会覆盖其下所有的 Member 的 name 和所有的 Level 的 name 属性的值。 allMemberCaption 例如 : allMemberCaption= “全部产品”这个是在表示层显示的内容 PrimaryKey 通过主键...

    Python全栈之列表数据类型详解

    前言 列表(list)同字符串一样都是有序的,因为他们都可以通过切片和索引进行数据...<class> 把一个字符串转换成一个列表 >>> var=abc >>> li = list(var) >>> li ['a', 'b', 'c'] list在把字符串转换成列表的时候,会

    j2me手机游戏代码

    public class SwordCanvas extends Canvas implements PopupListener { static int life,energy,skillpoint,x,y,maxlife,maxenergy; static int level; static int experience; static int gold; static int ...

Global site tag (gtag.js) - Google Analytics