`

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-5.1.48.zip

    MySQL Connector/J是MySQL数据库系统与Java应用程序之间的重要桥梁,它是一个实现了JDBC(Java Database Connectivity)规范的驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。"mysql-...

    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为你的数据库名 ...

    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+, ...

    Class.forName

    - **创建方式**:`new`直接创建对象,而`forName()`和`newInstance()`则通过类加载机制创建对象,提供了更多的灵活性,如在运行时根据配置或条件创建不同类型的对象。 此外,`Class.forName()`方法还有其他重载形式...

    mysql-connector-java-5.1.46-bin.jar

    接着,通过Class.forName()方法加载并注册驱动,如`Class.forName("com.mysql.jdbc.Driver");` 4. **建立连接**: 使用JDBC建立数据库连接通常涉及以下步骤: - 加载驱动:`DriverManager.registerDriver(new ...

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

    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 literal & instance.getClass() & Class.forName(String className)

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

    hibernate-validator-5.0.0.CR2-dist.zip

    Set<ConstraintViolation<User>> violations = validator.validate(new User()); for (ConstraintViolation<User> violation : violations) { System.out.println(violation.getMessage()); } ``` 在`my--...

    java中Class.forName的作用浅谈

    在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...

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

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

    jaxb-impl-2.1.9.jar&jaxb-api-2.2.6.jar

    Java Architecture for XML Binding (JAXB) 是Java平台中用于XML数据绑定的标准技术,它允许Java对象和XML数据之间进行相互转换。JAXB 提供了一种高效、方便的方式来处理XML文档,使得开发人员无需手动编写XML解析和...

    xercesimpl-2.8.1.jar

    1. **DOM解析**:Xerces-J通过DOM接口将XML文档转换为一个可操作的对象模型,开发者可以方便地通过对象进行遍历、修改和创建XML文档。DOM允许在整个文档树上进行随机访问,但内存消耗较大,适合处理小型或中型XML...

    dynamic-class.rar_自动创建类

    通过`Class.forName()`方法,可以加载指定名称的类。如果需要在运行时创建类,可能需要使用`java.lang.reflect.Proxy`或字节码操作库如ASM或ByteBuddy。例如,使用Proxy创建一个动态代理类: ```java interface ...

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

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

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

    这种方式可以直接通过类名获取Class对象,无需创建对象。 方式3:通过Class类中的forName()方法 通过Class类中的forName()方法可以获取Class对象,例如: ```java Class c3 = Class.forName(...

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

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

    JAVA反射机制-Class类-Class对象的获取.pdf

    每当一个类或者接口被加载到JVM中时,就会创建一个与之关联的`java.lang.Class`对象。通过这个`Class`对象,我们可以访问被加载类的各种细节,比如字段、构造器、方法等。 #### 获取Class对象的方法 1. **通过对象...

Global site tag (gtag.js) - Google Analytics