`
- 浏览:
10163 次
- 性别:
- 来自:
南京
-
java下Class.forName的作用是什么,为什么要使用它
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://wenku.baidu.com/link?url=NI7VLiYn8o46r8OGGfzFa-HdW_oDVg7ARzPpj9FvELL_ZTcXu0tXkgp_kPpRn_nrBfXW3s6X_f7VjUkjKspTsbE2oqNs50qKy8O6ZaR3HEC
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
- **模块化加载**:通过不同的类装载器实例来加载不同的模块,从而实现系统的模块化管理。 #### 结论 类装载器是Java平台中极其重要的一部分,它不仅支撑着Java程序的动态性和安全性,还为开发高度灵活、安全和可...
#### Java虚拟机的类装载实现与应用 ##### 装载过程简介 **装载**是指将类或接口的二进制形式(通常为`.class`文件)导入到JVM中,并创建相应的`Class`对象的过程。这个过程通常包括三个主要步骤:装载、链接和...
Java 类装载过程是Java虚拟机(JVM)运行的核心机制之一,主要涉及到类从加载到初始化的完整生命周期。这一过程确保了程序的正确运行,并在安全性方面起到关键作用。以下是详细的解释: 1)装载(Loading): 在这...
Android基于类装载器插件架构的实现主要涉及到Android系统中类的动态加载与插件化架构的设计。在Android开发中,由于APK包的独立性和Android系统对安全性的严格限制,传统的插件化技术在动态加载外部模块时面临着...
实例化前初始化 类装载时分配空间 多个对象共享同一内存空间 不能被垃圾收集线程收集 静态代码块 装载时运行 在main 之前 只运行一次 下次类再装载或创建对象时不运行 静态方法 类名调用(推荐) 实际也...
模板在编译时会产生多个实例化代码,这些实例在链接时会被合并;异常处理机制需要链接器确保每个函数的异常表正确对齐。 现在,我们来看一下压缩包中的文件名称列表,虽然它们是图片文件,但从名称推测可能包含PPT...
当启动一个Java应用时,实际上是在与三种类型的类装载器进行交互: 1. **引导程序类装载器(Bootstrap Class Loader)**:这是默认的第一个类装载器,用于加载Java的核心类库,如`java.lang`包中的类。引导程序类装载...
我们可以使用GestureStore实例化一个GestureLibrary对象,然后调用其`loadGestures()`方法加载手势文件。 4. **识别手势**:一旦手势库加载完成,我们就可以在GestureOverlayView上监听用户的画布动作。当用户在...
5. **装载器的运作机制**:如何在内存中安排程序,以及如何处理程序的入口点和初始化。 6. **动态链接**:解释了DLL(动态链接库)或SO(共享对象)的概念,以及它们如何在运行时被加载和使用。 7. **调试信息**:...
例如,当类模板被不同源文件使用时,链接器需要确保所有实例化都是唯一的。 装载,即程序在运行时加载到内存的过程,是操作系统负责的。在Linux系统中,这个过程由动态链接器(通常是ld-linux.so)完成。装载过程中...
在IT领域,优化问题是一个广泛研究的课题,而“集装箱的装载问题”是其中的一个典型实例,涉及到空间利用效率最大化的问题。这个问题的核心是如何在给定的三维空间内,有效地安排一系列圆柱形物体(在这里是木材)以...
### 货物装载问题与回溯法:深入解析与应用 #### 1. 回溯法概述 回溯法是一种高效且具有普遍适用性的算法,尤其在解决那些解空间较大,难以找到直接求解公式的问题时表现出色。它的工作原理基于深度优先搜索策略,...
本报告通过一个具体的实例,利用贪心算法来解决最优装载问题,并通过C++语言实现了相应的算法。 #### 问题描述 假设有一艘轮船,其载重限制为`c`,现在有`n`个集装箱,每个集装箱的重量分别为`a[1]`、`a[2]`、......
在装载镜像和重装系统的过程中,这类工具能提供便捷的环境隔离和管理功能。 总的来说,装载镜像和重装系统是IT维护和管理中的关键操作,涉及到了系统安装、数据安全、硬件驱动等多个方面。熟练掌握这些技能对于IT...
* 隐式类装载发生在由于引用、实例化或继承导致需要装载类的时候。隐式类装载是在幕后启动的,JVM会解析必要的引用并装载类。类的装载通常组合了显式和隐式两种方式。例如,Classloader可能先显式地装载一个类,然后...
《玻璃装载机——基于三菱PLC与威纶通触摸屏的自动化系统详解》 在现代工业生产中,自动化设备的应用日益广泛,其中PLC(可编程逻辑控制器)和触摸屏技术是实现设备智能化的重要手段。本项目以"玻璃装载机"为例,...
【ANSYS Workbench在装载机动臂结构参数优化中的应用】 装载机动臂是装载机工作装置的关键组成部分,其性能直接影响装载机的整体工作效率。传统的设计方法往往为了确保动臂的刚度和强度,会在材料厚度上预留较大的...
根据给定的信息,本文将详细解释如何使用C++与回溯法解决装载问题,并通过具体的代码实例进行解析。 ### 回溯法概述 回溯法是一种在搜索解空间树过程中寻找问题解的方法。它通常用于解决约束满足问题,如装载问题...
在给定的代码中,`Loading` 类模板用于表示装载问题的实例,包含数据成员如集装箱的重量数组 `w`,船只的载重量 `c`,当前重量 `cw`,最佳载重量 `bestw`,剩余重量 `r`,以及一个 `x` 数组来记录每个集装箱的装载...