0 0

class.forName 和 new 的区别0

求详解

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

为什么new创建一个对象的时候这个类还可以没有被加载 求。。。
2013年1月17日 10:36

9个答案 按时间排序 按投票排序

0 0

new是在编译时就要检查.class类型和路径
class.forName("xxxx").newInstance() 是在运行时找到改路径的类进行实列化 相当于先检查路径然后再实列化。

不懂你说的那些是什么意思  应该是先检查 后实列化  检查时只当它是个文件   实列化时它才是个对象

2013年1月20日 19:59
0 0

《深入Java虚拟机》上有详细的阐述:
在某个类型首次主动使用时,其类型必须被初始化。(初始化之前必然被装载和连接(当然解析步骤可以例外。)) 。
主动使用的情形包括:
1、创建某个类的新实例。(new 指令; 不明确创建:反射、克隆、反序列化)
2、
3、
4、调用JAVA API中某些反射方法。例如Class.forName();
5、
6、

何来new 的时候,这个类不被加载一说?

2013年1月18日 17:03
0 0

深入Java虚拟机上有详细的阐述

2013年1月18日 16:50
0 0

引用一个类的定义不一定会导致类的装载,你可以看什么情况下会导致一个类的装载.比如第一次使用 new 的时候,new 之前类一般是不会装载的.因为jvm是依需加载,不真正用的时候是不会加载一个类的!
http://www.blogjava.net/William/archive/2006/08/25/65804.html  2013-01-18 11:43

2013年1月18日 11:51
0 0

这有什么好纠结的,这只不过是一个简单的分步而已,比如说喝一杯水,你可以一口喝完,你也可以两口喝完,三口喝完...,你思考问题的方向偏了

2013年1月18日 11:28
0 0

这有啥难理解的?newInstance是类上的静态方法,在调用这个静态方法之前,如果类还没有被加载,那肯定要先加载并链接,然后才能调用方法。因此在“刚开始实际调用newInstance方法的一瞬间”,类必须已经被加载并链接了。

而new是一步到位,调用new的时候如果类还没有被加载,那么就一次性完成加载,链接,实例化。因此在“刚开始执行new语句那一瞬间”这个类可以还未被加载。

2013年1月17日 18:44
0 0

new创建一个对象的时候这个类还可以没有被加载 ,我理解不了啊,如果一个类不加载到内存,怎么可能会new出一个实例对象呢,打个比方,一个美女类MeiNvClass这个类你没有定义或者没有编译,你new MeiNvClass()能通过编译??显然是不会把。Class.forName是利用了java的反射机制,在运行时JVM调用了类加载器将类加载到内存,并探知它的变量,构造器等,所以这是可以newInstance。所以我有点儿理解不了“new创建一个对象的时候这个类还可以没有被加载 ”?虚心求教,请楼主不要怪罪啊~

2013年1月17日 17:28
0 0

class.forName("xxxx") 使用当前类的“初始类加载器”;打个比方,父加载器的path有某个类,子加载器首先调用了loadclass,那么这个类的初始类加载器是子加载器,定义类加载器是父加载器。

2013年1月17日 14:01
0 0

class.forName("xxxx")方法是用当前的classloader作为classloader.你可以使用令一个重载方法,指定classloader就可以实现你要的效果了。

2013年1月17日 11:27

相关推荐

    Class.forName

    下面将详细解释`Class.forName()`的工作原理、用途及其与`new`关键字的区别。 `Class.forName(String className)`方法接收一个字符串参数,这个字符串代表了类的全限定名(包括包名和类名)。当调用此方法时,JVM会...

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

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

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

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

    Java Class.forName()用法和newInstance()方法原理解析

    Java Class.forName()用法和newInstance()方法原理解析 Class.forName()方法是Java语言中的一种Class加载机制,它可以根据类名将对应的类加载到JVM中,同时也可以实例化该类。Class.forName()方法的主要功能是要求...

    java中Class.forName的作用浅谈

    下面我们将深入探讨`Class.forName()`的用途、工作原理以及与`new`关键字的区别。 一、`Class.forName()`的用途 1. **动态加载类**:当需要在程序运行时根据某些条件或用户输入来决定加载哪个类时,`Class.forName...

    liuwei1989#study-guide#17-Class.forName和classloader的区别1

    并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c

    浅谈java中类名.class, class.forName(), getClass()的区别

    Java 中类名.class, class.forName(), getClass() 的区别 Java 中有三种方式可以获取 Class 对象,即类名.class、class.forName() 和 getClass()。这些方法都可以获取 Class 对象,但是在获取 Class 对象的过程中,...

    Classfor的用法

    ### Class.forName 的用法详解 #### 一、概述 `Class.forName` 是 Java 反射 API 中的一个重要方法,主要用于动态加载类...在实际开发中,正确地理解和使用 `Class.forName` 能够极大地提高程序的灵活性和可维护性。

    jdbc驱动程序实例

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...

    jdbc中class.forname的作用

    在Java JDBC编程中,`Class.forName()` 方法起着至关重要的作用。它的主要任务是动态加载指定的类并执行其实例的静态初始化块。在上下文中,`Class.forName()` 被用来加载数据库驱动,比如MySQL的`...

    浅析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    `Class.forName()`方法内部调用了本地方法`forName0`,并传入了一个布尔参数`initialize`,默认值为`true`,表示在加载类之后执行初始化。初始化阶段不仅包括对类变量的赋值,还包括执行静态初始化块,对于父类也是...

    java于各种数据库连接额语句

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 为数据库SID String user = "test"; String password = "test"; ...

    forname实现工程内部反射机制

    总之,通过`Class.forName()`方法,我们可以实现在工程内部的反射机制,动态地访问和操作任何已知类,不论它们位于哪个包中。这为我们的代码提供了更高的灵活性和扩展性,但也需要注意反射可能会带来的安全风险和...

    Java中通过Class类获取Class对象的方法详解

    通过Class类可以获取Class对象,获取Class对象有三种方式:通过Object类的getClass()方法、通过类名.class获取Class对象、通过Class类中的forName()方法。每种方式都有其特点和应用场景,掌握这些方式可以帮助开发者...

    jdbc笔记整理 sql

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...

    Java反射简单例子

    首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于根据全限定类名(包括包名)加载类。例如,如果我们有一个名为`Robot`的类,我们可以使用以下代码加载它: ```java Class<?> ...

    excel的jdbc驱动

    Class.forName(driver).newInstance(); Connection con = DriverManager.getConnection(url); Statement stm = con.createStatement(); String sql = "select * from sheet"; for(int i=0;i;i++){ ResultSet ...

    mysql-connector-java-3.0.14-production-bin.jar

    mysql4.1.10的JDBC驱动 把它拷贝到你的web应用的WEB-INF\lib下(当然也可以设置CLASSPATH) <br>接着修改程序代码: 将你的: Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 改为: ...

    access jar驱动连接数据库

    access jar驱动连接数据库

    JDBC访问数据库步骤

    * Oracle 数据库(thin 模式):`Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();` * SQL Server 数据库:`Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();` * ...

Global site tag (gtag.js) - Google Analytics