`
akinlong
  • 浏览: 70524 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于Class.forName(className).newInstance()介绍(转载http://blog.chinaunix.net/u/15909/)

阅读更多

Class.forName(xxx.xx.xx) 返回的是一个类

首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。

至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。
A a = (A)Class.forName("pacage.A").newInstance();
这和你
A a = new A();
是一样的效果。

关于补充的问题
答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。

Class.forName(xxx.xx.xx) 返回的是一个类
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构造。

下面内容转自
http://blog.csdn.net/iceman1952/archive/2007/03/07/1523025.aspx
介绍的是 forName() 和 ClassLoader 的 loadClass 方法。
现在终于知道了为什么 forName()是会执行 static 语句,因为默认情况它总是初始化这个被装载的类。
关于forName()方法
这个方法总是返回要加载的类的Class类的实例
1、forName(String className)单参数时, initialize=true
    a.总是使用当前类装载器(也就是装载执行forName()请求的类  的类装载器)
    b.总是初始化这个被装载的类(当然也包括:装载、连接、初始化)
2、forName(String className, boolean initialize, ClassLoader loader)
    a.loader指定装载参数类所用的类装载器,如果null则用bootstrp装载器。
    b.initialize=true时,肯定连接,而且初始化了;
    c.false时,绝对不会初始化,但是可能被连接了,但是这里有个例外,如果在调用这个forName()前,已经被初始化了,那么返回的类型也肯定是被初始化的(当然,这里也暗含着:被同一个loader所装载的,而且这个类被初始化了)

关于用户自定义的类装载器的loadClass()方法
1、loadClass(String name)单参数时, resolve=false
    a.如果这个类已经被这个类装载器所装载,那么,返回这个已经被装载的类型的Class的实例,否则,就用这个自定义的类装载器来装载这个class,这时不知道是否被连接。绝对不会被初始化
    b.这时唯一可以保证的是,这个类被装载了。但是不知道这个类是不是被连接和初始化了
2、loadClass(String name, boolean resolve)
    a.resolve=true时,则保证已经装载,而且已经连接了。resolve=falses时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接
分享到:
评论

相关推荐

    Class.forName()_newInstance()_New_三者区别

    在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...

    class literal & instance.getClass() & Class.forName(String className)

    在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...

    Class.forName

    `Class.forName()`是Java中一个非常重要的方法,它主要用于动态加载和实例化类。这个方法在编程中常常用于实现灵活性和解耦,特别是在框架和插件系统中。下面将详细解释`Class.forName()`的工作原理、用途及其与`new...

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

    Java中的`Class.forName()`方法是一个非常关键的工具,主要用于动态加载类。它的作用在于根据给定的类全名(包括包名)返回对应的`Class`对象。`Class`对象是Java反射机制的基础,它代表着运行时的类信息,可以通过...

    在Java的反射中,Class.forName和Class

    首先,`Class.forName(String className)`是Java反射API中的一个静态方法,它用于根据给定的全限定类名(包括包名)动态地加载类。当你的应用程序需要在运行时才知道要使用哪个类,或者想要延迟加载某个类以提高性能...

    Classfor的用法

    `Class.forName` 经常与 `newInstance` 方法配合使用,以实现动态创建对象的目的。`newInstance` 方法用于创建 `Class` 对象所表示的类的实例。 **示例**: ```java try { Class<?> clazz = Class.forName(...

    QQ网页在线客服1

    <... <head> <FCK:meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>隐藏在网页一侧的隐现效果QQ在线客服<...layer class="NS" 0)" ... <img height="25" alt="" src="...

    struts,spring,hibernater集合文档

    className="org.springframework.web.struts.ContextLoaderPlugIn"> </plug-in> ``` - 配置请求处理器为 Spring 提供的 `DelegatingRequestProcessor`。 - 示例代码: ```xml ...

    asp.net菜单(很简单)

    enableiframeshim: 1, //1 or 0, for true or false //No need to edit beyond here//////////////////////// dropmenuobj: null, ie: document.all, firefox: document.getElementById&&!document.all, ...

    webservice 发布步骤

    <parameter name="className" value="server.AxisReturn"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> ``` - 将此文件放置于`C:\Tomcat5\webapps\axis\WEB-INF\src\server`目录...

    Apache Tomcat 8.5的安装配置 、JDK 1.8的安装

    在本文中,我们将详细介绍如何在Linux系统上安装和配置Apache Tomcat 8.5以及JDK 1.8。 首先,让我们来安装JDK 1.8。Oracle官方网站提供了JDK的下载链接,对于Java SE Development Kit 8u331,你可以从以下网址获取...

    Java最新面试题2023,Java八股文2023

    - 基本数据类型包括byte、short、int、long、float、double、char和boolean,它们的默认值分别为0、0、0、0L、0.0f、0.0d、'\u0000'和false。 - 封装类如Integer、Long等是这些基本类型的对象形式,具有额外的方法...

    公司招聘异地笔试题.doc

    E1Document e1 = E1Document.Factory.newInstance(); com.example.model.E1 e1Type = e1.addNewE1(); com.example.model.E1.E11 e11 = e1Type.addNewE11(); e11.setIntValue(11); ...

    newInstance()方法和new关键字

    Class<?> clazz = Class.forName(className); Object obj = clazz.newInstance(); ``` - **new关键字**适用于以下情况: - 需要显式指定构造函数参数时。 - 类的实例化逻辑简单且明确。 - 示例代码: ```...

    开发跨浏览器JavaScript时要注意的问题

    本文将详细介绍在开发跨浏览器JavaScript时需要注意的关键问题,并给出相应的解决方案。 #### 1. 使用`<tbody>`元素以确保IE兼容性 当创建HTML表格时,一些现代浏览器(如Chrome、Firefox等)允许直接向`<table>`...

    webservice :spring 3+cxf3.4服务方,AXIS1.4请示方调用

    本文将详细介绍如何使用Spring 3 + CXF 3.4搭建服务端,并通过Axis 1.4进行调用。 #### Spring 3 + CXF 3.4搭建WebService服务端 **步骤一:复制接口类** 首先,需要将定义好的接口类(例如`...

    riak-session-manager.zip

     <Manager className="com.jbrisbin.vpc.riak.session.RiakManager" defaultUri="http://localhost:8098/riak/{bucket}/{key}" mapReduceUri="http://localhost:8098/mapred" maxInactiveInterval="1800"/></...

    jQuery-3.3.1-API-Docs-CN jQuery离线文档

    1. **选择器**:jQuery的核心功能之一就是强大的选择器,如ID选择器("#id"),类选择器(".class"),元素选择器("tag"),以及组合选择器,如后代选择器("ancestor descendant"),相邻兄弟选择器("+")和通用兄弟选择器...

    Appium参考文档汇总及安装1

    Appium支持多种定位策略,如XPath、ID、ClassName等,详细的定位策略可以在Appium的官方文档中查看:http://appium.io/docs/en/commands/element/find-elements/index.html#selector-strategies。对于Android应用,...

    SSH框架集成步骤

    本文档将详细介绍如何将这三个框架进行集成,包括配置文件的设置、各组件之间的交互以及如何通过Spring来管理事务。 #### 二、集成Struts与Spring ##### 1. 集成Struts和Spring **1.1 在struts-config.xml中添加...

Global site tag (gtag.js) - Google Analytics