JDBC在加载驱动中使用Class.forName()用法详解

一.什么是class对象

类是程序的一部分,每个类都有一个class对象。换言之,每当编写并且编译了一个新类,就会产生一个class对象(更恰当的说,是被保存在一个同名的class文件中)。为了生成这个类的对象,运行这个程序的Java虚拟机(jvm)将使用被称为“类加载器”的子系统。

所有的类都是在对其第一次使用的时候被加载到JVM中。如当程序创建对第一个静态成员的引用时,就会加载这个类。或者使用new关键字创建新的对象的时候。

因此java程序在它运行之前并非完全加载,其各个部分是在必须的时候才加载的。类加载器首先检查这个类的class对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件。

实际上在Java中每个类都有且只有一个Class对象。

Class 没有公共构造方法,因此不能显式地声明一个Class对象,Class 对象是在载入类时由Java 虚拟机以及通过调用类载入器中的 defineClass 方法自己主动构造的。

Class类被创建后的对象就是Class对象,注意,Class对象表示的是自己手动编写类的类型信息,比如创建一个Shapes类,那么,JVM就会创建一个Shapes对应Class类的Class对象,该Class对象保存了Shapes类相关的类型信息。实际上在Java中每个类都有一个Class对象,每当我们编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里(编译后的字节码文件保存的就是Class对象),那为什么需要这样一个Class对象呢?是这样的,当我们new一个新对象或者引用静态成员变量时,Java虚拟机(JVM)中的类加载器子系统会将对应Class对象加载到JVM中,然后JVM再根据这个类型信息相关的Class对象创建我们需要实例对象或者提供静态变量的引用值。需要特别注意的是,手动编写的每个class类,无论创建多少个实例对象,在JVM中都只有一个Class对象,即在内存中每个类有且只有一个相对应的Class对象,挺拗口,通过下图理解:
在这里插入图片描述
到这我们也就可以得出以下几点信息:

  • Class类也是类的一种,与class关键字是不一样的。
  • 手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件),比如创建一个Shapes类,编译Shapes类后就会创建其包含Shapes类相关类型信息的Class对象,并保存在Shapes.class字节码文件中。
  • 每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象。
  • Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载。
  • Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要(关于反射稍后分析)。

二.获得class对象的三种方法

1、调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。

比如:

Object n;
Class  c = n.getClass();

Object.getClass(), Object中自带的方法;getclass(),返回一个class对象。

2、使用Class类的中静态forName()方法获得与字符串相应的Class对象。

比如:
Class c2=Class.forName(“MyObject”),MyObject必须是接口或者类的名字。

Class c=Class.forName("类的全限定名")

传入string类型参数,要求jvm查找并加载指定的类,返回的是一个class对象的引用。
3、获取Class类型对象的第三个方法是在类型后面加上.class就代表了匹配的类对象。

比如:

Class cl1 =Obeject.class;
Class cl2 = int.class;

注意:Class对象实际上描写叙述的仅仅是类型。而这类型未必是类也有可能是接口。

三.class的作用和方法

getname():以string类型返回class对象表示的实体(类,接口,数组,基本类型,void等)名称
newInstance():创建一个实例,只能调用默认构造器。
getsuperclass():返回class表示的实体超类的名称
getSimpleName()。不办含包名的类名。
isInterfence:告诉你这个class对象是否表示某个接口。

1、getName()

一个Class对象描写叙述了一个特定类的属性,Class类中最经常使用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

2、newInstance()

Class另一个实用的方法能够为类创建一个实例,这种方法叫做newInstance()。比如:
x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无參数构造器)初始化新建对象。

3、getClassLoader()

返回该类的类载入器。

4、getComponentType()

返回表示数组组件类型的 Class。

5、getSuperclass()

返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。

6、isArray()

判定此 Class 对象是否表示一个数组类。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值