Class类

来源:互联网 发布:网络黄金骗局举报电话 编辑:程序博客网 时间:2024/06/06 18:01

一、认识Class

 

反射机制允许在运行时发现和使用类型的信息。在Java中用来表示运行时类型信息的对应类就是Class类,也继承Object类其内声明了数个应该在所有Java类中被改写的方法:hashCode()equals()clone()toString()getClass()等。其中getClass()返回一个Class类的对象。Class类样继承自Object,其实体用以表达Java程序运行时的类和接口

 

public final class Class<T> implements java.io.Serializable,GenericDeclaration,Type, AnnotatedElement { private static final int ANNOTATION= 0x00002000; private static final int ENUM = 0x00004000; private static final int SYNTHETIC = 0x00001000; private static native void registerNatives(); static { registerNatives(); }  private Class(ClassLoader loader) {/* * (私有构造,只能由JVM创建该类) */classLoader = loader; } 

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



二、综上:

(1)Class类也是类的一种,与class关键字是不一样的。

(2)手动编写的类被编译后会产生一个Class对象,表示的是创建的类的类型信息,保存在同名.class的文件中(字节码文件),比如创建一个Shapes类,编译Shapes类后就会创建其包含Shapes类相关类型信息的Class对象,并保存在Shapes.class字节码文件中。

(3)每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象

(4)Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载

(5)Class类的对象作用是运行时提供或获得某个对象的类型信息,(反射机制)

 

三、Class类加载

 实际上所有的类都是在对其第一次使用时动态加载到JVM中的,当程序创建第一个对类的静态成员引用时,就会加载这个被使用的类(实际上加载的就是这个类的字节码文件),注意,使用new操作符创建类的新实例对象也会被当作对类的静态成员的引用(构造函数也是类的静态方法)。Java程序在它们开始运行之前并非被完全加载到内存的,是按需加载, 所以在使用该类时,类加载器首先会检查这个类的Class对象是否已被加载(类的实例对象创建时依据Class对象中类型信息完成的),如果还没有加载,默认的类加载器就会先根据类名查找.class文件(编译后Class对象被保存在同名的.class文件中),在这个类的字节码文件被加载时,它们必须接受相关验证,以确保其没有被破坏并且不包含不良Java代码(这是java的安全机制检测),完全没有问题后就会被动态加载到内存中,此时相当于Class对象也就被载入内存了(毕竟.class字节码文件保存的就是Class对象),同时也就可以被用来创建这个类的所有实例对象。下面通过一个简单例子来说明Class对象被加载的时机问题


原创粉丝点击