`
jzinfo
  • 浏览: 118154 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java中Class.forName的真正含义

阅读更多

本文转载自:http://www.cnblogs.com/mgod/archive/2007/10/19/931013.html

 

Class.forName(xxx.xx.xx) 返回的是一个类, .newInstance() 后才创建一个对象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

 

Class aClass = Class.forName(xxx.xx.xx);
Object anInstance = aClass.newInstance();


Class.forName("").newInstance()返回的是object
but there is some limit for this method to create instance
that is your class constructor should no contain parameters, and you should cast the instance manually.

Class Driver{
protected static Driver current;
public static Driver getDriver(){
return current;
}
}

Class MyDriver extends Driver{
static{
Driver.current=new MyDriver();
}
MyDriver(){}
}

用时:
Class.forName("MyDriver");
Driver d=Driver.getDriver();

有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?

Class.forName(xxx.xx.xx) 返回的是一个类,
.newInstance() 后才创建一个对象

Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}

所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了


下面给一个例子:Class的最大作用就是实现了动态加载类,为多态提供了很好的帮助。

class A
{
    void aa()
    {
        System.out.println ("A里的");    
        
    }    
    
}
class B extends A
{
    void aa()
    {
        System.out.println ("B里的");    
        
    }    
    
}
class C extends A
{
    void aa()
    {
        System.out.println ("C里的");    
        
    }    
    
}


public class ClassDemo
{
    
    public static void main(String[] args)
    {
        ClassDemo t=new ClassDemo();
        t.show("C");
    }
    void show(String name)
    {
        try
        {
             A show=(A)Class.forName(name).newInstance();
        show.aa();
    }
    catch(Exception e)
    {
        System.out.println (e);
        }
            
        
    }
    
    
}

 

分享到:
评论

相关推荐

    java中Class.forName方法的作用详解

    Java中的`Class.forName()`方法是一个非常关键的工具,主要用于动态加载类。它的作用在于根据给定的类全名(包括包名)返回对应的`Class`对象。`Class`对象是Java反射机制的基础,它代表着运行时的类信息,可以通过...

    Java Class.forName()无法加载类

    NULL 博文链接:https://listen-raining.iteye.com/blog/1894456

    Class.forName

    `Class.forName()`是Java中一个非常重要的方法,它主要用于动态加载和实例化类。这个方法在编程中常常用于实现灵活性和解耦,特别是在框架和插件系统中。下面将详细解释`Class.forName()`的工作原理、用途及其与`new...

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

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

    java中Class.forName的作用浅谈

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

    在Java的反射中,Class.forName和Class

    在Java的反射机制中,`Class.forName`和`ClassLoader`都是关键组件,它们在程序运行时动态加载类和实现类的实例化方面扮演着重要角色。理解这两个概念及其区别是深入掌握Java反射的重要一步。 首先,`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.forName(), getClass()的区别

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

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

    Class.forName()方法是Java语言中的一种Class加载机制,它可以根据类名将对应的类加载到JVM中,同时也可以实例化该类。Class.forName()方法的主要功能是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码...

    class.forname的作用 详细解析抽象类和接口的区别

    首先,abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系(因为 Java 不支持多继承)。但是,一个类却可以实现多个 interface。其次,在 abstract class 的定义中,我们可以赋予方法...

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

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

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

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

    Java 类加载机制 ClassLoader Class.forName.pdf

    2. **通过`Class.forName()`方法动态加载**:可以在运行时动态地加载类。 3. **通过`ClassLoader.loadClass()`方法动态加载**:提供了更多的灵活性,可以根据不同的需求加载不同的类。 这三种方式各有特点,具体...

    jdbc中class.forname的作用

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

    注册驱动:Class.forName(xxx.Driver).xmind

    对SPI,理论联系实际的理解

    Classfor的用法

    `Class.forName` 是 Java 反射 API 中的一个重要方法,主要用于动态加载类。该方法的主要作用是根据提供的全限定类名来加载并返回对应的 `Class` 对象。在 Java 开发过程中,当我们需要根据用户的输入或者配置文件中...

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

    `Class.forName()`方法在Java官方文档中被描述为在运行时动态加载一个类并返回`Class`对象。在JDBC中,`Class.forName("com.mysql.jdbc.Driver")`的作用是加载MySQL的JDBC驱动类,即`com.mysql.jdbc.Driver`。虽然...

    mysql-connector-java-5.1.40.tar.gz

    在这个例子中,`Class.forName("com.mysql.jdbc.Driver")` 加载了MySQL的JDBC驱动,然后`DriverManager.getConnection()` 创建了一个数据库连接。 MySQL Connector/J 5.1.40 版本支持JDBC 4.0规范,适用于Java SE 6...

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

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

Global site tag (gtag.js) - Google Analytics