`

java - Class.forName() - new - 创建对象的不同方式

    博客分类:
  • java
 
阅读更多

1. Class.forName的作用以及为什么要用它

       ● Class.forName作用

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

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

        ● 什么时候用

        若一个字符串变量代表一个类的包名和类名,怎么实例化它?只有你提到的这个方法了,不过要再加一点:newInstance(); 。
        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://www.diybl.com/course/3_program/java/javajs/20090215/155546.html

 

2. 创建对象方式

     ● 用new语句创建对象,这是最常用的创建对象的方式。

     ● 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。

     ● 调用对象的clone()方法。

     ● 运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法.

实现demo :  http://blog.csdn.net/mhmyqn/article/details/7943411

分享到:
评论

相关推荐

    mysql-connector-java-8.0.11.jar

    Class.forName("com.mysql.cj.jdbc.Driver"); Fri Jun 08 13:09:27 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, ...

    mysql-connector-java-commercial-5.1.30-bin.jar

    <%Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String url ="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //first为你的数据库名 ...

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

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

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

    mysql-connector-java-5.1.48.zip

    Class.forName("com.mysql.jdbc.Driver"); //获取数据库连接对象url=jdbc:mysql://IPAddress:3306/DatabaseName connection= DriverManager.getConnection("jdbc:mysql://192.168.1.99:3306/root","root","root...

    commons-fileupload-1.2.jar和commons-io-1.3.2.jar

    throw new IOException(name + ": wrong type"); } } try { // 保存上传的文件到指定的目录 // 在下文中上传文件至数据库时,将对这里改写 item.write(new File("d:\\" + m.group(1))); out.print(name+...

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

    Java中 Class.forName()_newInstance()_New_三者区别。

    java中Class.forName的作用浅谈

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

    spring-boot-reference.pdf

    10.1. Installation Instructions for the Java Developer 10.1.1. Maven Installation 10.1.2. Gradle Installation 10.2. Installing the Spring Boot CLI 10.2.1. Manual Installation 10.2.2. Installation with...

    fastjson-1.2.7.jar通用json文本解析实例(轻开IOS和安卓App服务器开发)

    tools.canName(key)) key = new StringBuffer("_").append(key).toString(); Object ob = entry.getValue(); if(ob instanceof JSONArray)//如果下级是json数组就调jsonArray2Bag { jsonArray2Bag...

    greenplum-jdbc-5.1.4.jar

    forName(className);  System. out.println("加载数据库驱动成功!" );  } catch (ClassNotFoundException e ) {  System. out.println("加载数据库驱动失败!" );  e.printStackTrace();  }  }  /*...

    jfreechart-1.0.4.jar jfreechart-1.0.4-swt.jar

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con=DriverManager.getConnection("jdbc:odbc:aaa"); Statement sql=con.createStatement(); ResultSet rs=sql.executeQuery("select * from test")...

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

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

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

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

    javacv-platform-1.3.3-src

    To learn how to use the API, since documentation currently lacks, please refer to the Sample Usage section below as well as the sample programs, including two for Android (FacePreview.java and Record...

    java连接数据库字符串

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

    学生信息管理系统-JAVA-连接数据库.pdf

    //当前登录管理员的主键 //获得 jdbc 链接 public Connection connection(){ try { Class.forName(DRIVER); Connection con=DriverManager.getConnection(URL, USERNAME, PASSWORD); return con; } catch (Exception...

    学生信息管理系统-java-连接数据库.doc

    //当前登录管理员的主键 //获得jdbc链接 public Connection connection(){ try { Class.forName(DRIVER); Connection con=DriverManager.getConnection(URL, USERNAME, PASSWORD); return con; } catch (Exception e...

    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 高级特性.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