`

Class.forName与new 得区别

    博客分类:
  • java
阅读更多

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也就是factory就可以。 从JVM的角度看,使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。 现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 分步的好处是显而易见的:可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。 最后用最简单的描述来区分new关键字和newInstance()方法的区别: newInstance: 弱类型。低效率。只能调用无参构造。 new: 强类型。相对高效。能调用任何public构造。 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_三者区别。

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

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

    java中Class.forName的作用浅谈

    介绍了java中Class.forName的作用,有需要的朋友可以参考一下

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

    主要介绍了Java Class.forName()用法和newInstance()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    jdbc驱动程序实例

    Class.forName("org.gjt.mm.mysql.Driver").newInstance(); //或者Class.forName("com.mysql.jdbc.Driver"); String url ="jdbc:mysql://localhost/myDB? user=soft&password=soft1234&useUnicode=true&...

    java连接数据库字符串

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

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

    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; //mydb为数据库 String user="sa"; String password=...

    jdbc笔记整理 sql

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

    Oracle命令大全

    Class userDaoClass = Class.forName(config .getInitParameter("userDao")); Object userDao = userDaoClass.newInstance(); Class userServiceClass = Class.forName(config ....

    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(); 改为: ...

    JDBC连接各种数据代码.doc

    Class.forName( "oracle.jdbc.driver.OracleDriver" ); con = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "scott", ”tiger”); 连接SqlServer2000 msbase.jar ...

    Java 连接多种数据库代码参考

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

    access jar驱动连接数据库

    access jar驱动连接数据库

    Thinking in Java 4th Edition

    Name visibility ............................. 50 Using other components ............. 50 The static keyword ..................... 51 Your first Java program ....... 52 Compiling and running .............

    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 conn...

    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 conn...

    Java 反射(Reflection) 经典实用例子

    Class ownerClass = Class.forName(className) :首先得到这个类的Class。 Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。 Object property = field.get(ownerClass) :...

    读取数据库信息到xml

    //Class.forName("oracle.jdbc.driver.OracleDriver");//oracle数据库 Class.forName("com.mysql.jdbc.Driver");//mysql数据库 conn=DriverManager.getConnection("jdbc:mysql://192.168.1.109/cpsad?user=root&...

    myeclipse连接mysql驱动程序和包

    import java.sql.DriverManager; import java.sql.SQLException; ... ...public class SqlConnect { public Connection getConnection... Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn=null;

    Java 高级特性.doc

    String obj = (String)Class.forName("java.lang.String").newInstance(); 这是制造另一个章:Class.forName("java.lang.Integer") --------------------- 讲Constructor://构造方法 Constructor constructors[]...

Global site tag (gtag.js) - Google Analytics