1. java虚拟机类加载的过程和时机
- 类加载
- 内置的类加载器,将class文件加载入虚拟机内存
- 为当前class文件生成java.lang.Class对象(创建对象的模板,分析类的属性方法)
- 类链接
- 验证:验证当前类的语法结构
- 准备: 类变量的内存分配
- 解析: 将变量名换成内存地址
- 类初始化
- 初始化: 变量进行初始化
2. 何时会触发类的加载和初始化
- java命令执行相应的class 文件的时候
- 创建类的对象 new Person()
- 调用类的静态方法或静态变量 Person.name Person.eat()
- 初始化某个类的子类
- 通过反射机制获取java.lang.Class对象的时候
3. 类加载器的作用
- 将class文件加载入内存,为class文件生成 java.lang.Class对象
4. Java类加载器分类(父类委托)
- 应用程序类加载器:负责加载我们工程中自定义的类
- 平台类加载器:底层类库的加载
- 根类加载器:底层类库的加载
5. 反射的概念
- 概念:通过class对象动态的获取类内部结构(构造函数,方法,变量),对其进行调用的过程
6. 获取类class对象的三种方式
- 类名.class
- 对象.getClass()
- Class.forName("完整类路径")
7. 反射获取构造方法
- 获取共有构造方法: c.getConstructors()
- 获取全部构造方法: c.getDeclaredConstructors()
- 获取单个的共有构造方法: c.getConstructor(Class<?>... parameterTypes)
- 获取单个全部的构造方法:c.getDeclaredConstructor(Class<?>... parameterTypes)
- 获取到构造方法对应的对象后如何实例化:newInstance()
- 可以调用私有构造:setAccessible(true);
8. 反射获取字段
- 获取所有公有属性:getFields()
- 获取所有属性:getDeclaredFields()
- 获取单个公有属性:getField(String fieldName)
- 获取单个所有属性:getDeclaredField(String fieldName)
- 为属性赋值:addressField.set(obj,"西安");
- 读取属性的值:addressField.get(obj)
9. 反射调用方法
- 获取所有公有方法包括继承来的:getMethods()
- 获取所有方法不包括继承来的:getDeclaredMethods()
- 获取单个公有方法:getMethod("方法名")
- 获取单个方法:getDeclaredMethod("方法名")
- 方法调用:m.invoke(obj);
|
|