类的加载概述和加载时机
A:类的加载概述
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。- 加载
就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。 连接
- 验证 是否有正确的内部结构,并和其他类协调一致
- 准备 负责为类的静态成员分配内存,并设置默认初始化值
- 解析 将类的二进制数据中的符号引用替换为直接引用
初始化 就是我们以前讲过的初始化步骤
- 加载
- B:加载时机
- 创建类的实例
- 访问类的静态变量,或者为静态变量赋值
- 调用类的静态方法
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
类加载器的概述和分类
- A:类加载器的概述
- 负责将.class文件加载到内存中,并为之生成对应的Class对象。虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。
- B:类加载器的分类
- Bootstrap ClassLoader 根类加载器
- Extension ClassLoader 扩展类加载器
- Sysetm ClassLoader 系统类加载器
- C:类加载器的作用
- Bootstrap ClassLoader 根类加载器
- 也被称为引导类加载器,负责Java核心类的加载
- 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
- Extension ClassLoader 扩展类加载器
- 负责JRE的扩展目录中jar包的加载。
- 在JDK中JRE的lib目录下ext目录
- Sysetm ClassLoader 系统类加载器
- 负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径
- Bootstrap ClassLoader 根类加载器
- A:类加载器的概述
反射
A:反射概述
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意一个方法和属性;
- 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
- 要想解剖一个类,必须先要获取到该类的字节码文件对象。
- 而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
B:三种方式(且这三种方式得到的同一个字节码文件)
- Object类的getClass()方法,判断两个对象是否是同一个字节码文件
- 静态属性class,锁对象
- Class类中静态方法forName(),读取配置文件
C:案例演示
package com.dexuan.reflect; import com.dexuan.bean.Person; public class Demo1_Reflect { /** * @param args * @throws ClassNotFoundException */ public static void main(String[] args) throws ClassNotFoundException { Class clazz1 = Class.forName("com.dexuan.bean.Person"); //**拿到字节码**首要 Class clazz2 = Person.class; // .class就是转化为字节码文件 Person p = new Person(); Class clazz3 = p.getClass(); System.out.println(clazz1 == clazz2); System.out.println(clazz2 == clazz3); } }
- 通过反射获取带参构造方法
通过反射获取成员变量
通过反射获取方法
——>反射的作用就是先获取在修改 - ArrayList的一个对象,在这个集合中添加一个字符串数据,如何实现呢?
答:通过反射越过泛型检查。
泛型只在编译期有效,在运行期会被擦除掉 - 十分钟理解 Java 中的动态代理 (https://blog.csdn.net/andyzhaojianhui/article/details/72833114)
- JDK5新特性之枚举类
- A:枚举概述
是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。举例:一周只有7天,一年只有12个月等。 - B:回想单例设计模式:单例类是一个类只有一个实例
那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例。这才能是枚举类。
- A:枚举概述
- 枚举的注意事项
- 定义枚举类要用关键字enum
- 所有枚举类都是Enum的子类
- 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
- 枚举类可以有构造器,但必须是private的,它默认的也是private的。
- 枚举类也可以有抽象方法,但是枚举项必须重写该方法
- 枚举在switch语句中的使用,因为实例是有限的与switch,case方法更契合
- 枚举类的常见方法
- int ordinal() //枚举项的编号
- int compareTo(E o) //比较编号
- String name() //获取实例名称
- String toString() //toString方法可重写然后调用
- <T> T valueOf(Class<T> type,String name) //通过字节码对象获取枚举项
- values() //遍历所有枚举值
- 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便
- JDK7新特性
- 二进制字面量,可以直接打印二进制数(结果显示为十进制)
- 数字字面量可以出现下划线:100_00
- switch 语句可以用字符串
- 泛型简化,菱形泛型
- 异常的多个catch合并,每个异常用 或: |
- try-with-resources 语句,1.7版标准的异常处理代码
JDK8的新特性
- 接口中可以定义有方法体的方法,如果是非静态,必须用default修饰,静态的则不用
- 局部内部类在访问他所在方法中的局部变量必须用final修饰,在jdk8中默认有final可以省略。
public class Demojdk8 { public static void main(String[] args) { Demo d = new Demo(); d.print(); Inter.method(); //接口名调用 } } interface Inter{ public default void print() { System.out.println("Hello world"); } public static void method() { System.out.println("static method"); } } class Demo implements Inter{ }
学习日记49--java学习--反射,jdk新特性
最新推荐文章于 2022-08-11 21:20:49 发布