1.类加载器
a.类的加载:
定义:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
一个类在加载过程中的三部曲:
A.加载 :
就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象。
B.连接:
验证 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用
C.初始化
b.类的加载时机:
A.创建类的实例
B.访问类的静态变量,或者为静态变量赋值
C.调用类的静态方法
D.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
E.初始化某个类的子类
F.直接使用java.exe命令来运行某个主类
c.加载器分类
A.类加载的作用:
负责将.class文件加载到内在中,并为之生成对应的Class对象。
B.类加载器的分类
①.Bootstrap ClassLoader 根类加载器
也被称为引导类加载器,负责Java核心类的加载
比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
②. Extension ClassLoader 扩展类加载器
负责JRE的扩展目录中jar包的加载。
在JDK中JRE的lib目录下ext目录
③.Sysetm ClassLoader 系统类加载器
负责在JVM启动时加载来自java命令的class文件
2.反射
Student.java--Student.class(字节码文件)--看成一个对象,这个对象就叫字节码文件对象--对应的类Class
定义:通过字节码文件对象去使用成员。
获取字节码文件对象的三种方式:
A:Object类的getClass()方法
B:数据类型的静态class属性
C:Class类的静态方法forName()
注意:
在平常写案例的时候,我们直接使用第二种最方便。但是实际开发中,我们一般用的都是第三 种。是因为第三种接收的是一个字符串类型的参数,我们可以把这个参数作为配置文件的内容进行 配置,这样就实现了一个变化的内容。
反射的使用步骤
Class:
成员变量 Field
构造方法 Constructor
成员方法 Method
反射:class字节码文件对象 -- 去得到对应的成员对象 -- 通过该成员的对象调用方法使用,通过 反射获取构造方法并使用
a.通过反射获取构造方法
public Constructor[] getConstructors() 获取公共的构造方法
public Constructor[] getDeclaredConstructors() 获取所有的构造方法(包括私有)
public Constructor getConstructor(Class... parameterTypes) 根据构造参数获取公共的指定构造
public Constructor getDeclaredConstructor(Class<?>... parameterTypes) 根据构造参数获取指定构造(包括私有,但是私有在使用的时候需要取消访问限制)
b.通过反射获取构造方法并创建对象
public T newInstance(Object... initargs)
c.通过反射获取成员变量并使用
public Field[] getFields()获取公有的成员变量
public Field[] getDeclaredFields()获取全部的成员变量,包括私有
public Field getDeclaredField(String name) 传入变量名称返回指定的成员变量对象,包括私有
public Field getField(String name)传入变量名称返回指定的成员变量对象,仅可获取共有的
public void set(Object obj,Object value)给一个对象的一个字段设置一个值
d.通过反射获取成员方法并使用
public Method[] getMethods()获取所有公共成员方法
public Method[] getDeclaredMethods()获取所有成员方法,包括私有
public Method getMethod(String name, Class<?>... parameterTypes)
参数一:方法名 参数二:方法参数类型.class 获取指定的公共方法
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
参数一:方法名 参数二:方法参数类型.class 获取指定的方法,包括私有
Object invoke(Object obj, Object... args) 让某一个对象使用这个方法,并且传入参数
原文地址:http://12925070.blog.51cto.com/12915070/1929518