Java反射与设计模式笔记一、笔记核心知识点总结一反射1. 基础概念• 类的对象new 创建的实例承载业务数据一个类可以有多个。• 类对象Class对象类加载后生成唯一封装该类全部结构包名、父类、属性、方法、构造器一个类仅存在1份。• 反射运行时获取Class对象动态操作类的构造、方法、属性。2. 三种获取Class对象的方式1. 对象调用getClass()必须先实例化对象运行时获取。2. 类名.class编译期就能拿到无需实例化。3. Class.forName(全限定类名)传入包名类名字符串仅写类名会抛ClassNotFoundException会主动触发类加载框架配置文件常用。3. 类加载触发时机1. 首次new创建对象2. 首次访问静态变量/静态方法3. 子类加载会优先加载父类4. 反射Class.forName()获取Class对象。4. 反射核心操作API1. 获取类信息◦ getName()获取完整类名◦ getMethods()获取本类父类所有public方法◦ getDeclaredMethods()仅获取本类全部方法包含私有。2. 实例化对象◦ 无参构造c.newInstance()实体类建议提供无参构造否则抛实例化异常◦ 有参构造先getConstructor(参数类型.class)获取构造器再newInstance(实参)创建对象。3. 调用私有方法◦ getDeclaredMethod(方法名)拿到私有方法◦ setAccessible(true)暴力破除访问权限◦ invoke(实例对象)执行方法。5. 反射优缺点• ✅ 优点代码高度通用灵活Spring、MyBatis等底层框架核心依赖反射• ❌ 缺点代码繁琐、可读性差破坏面向对象封装特性。二设计模式笔记重点单例、工厂1. 设计模式定义行业通用、反复复用的代码解决方案共23种用于规范化代码结构、降低耦合。2. 单例模式保证JVM中仅存在该类一个实例1饿汉式• 实现类加载时直接创建静态常量对象私有构造器静态方法返回实例。• 优势无线程安全问题并发效率高• 劣势类加载就创建对象未使用也占用内存空间利用率低。2懒汉式同步锁版• 实现静态变量初始为null调用getInstance()时判断为空才创建方法加synchronized保证线程安全。• 优势使用时才创建节省内存• 劣势每次调用方法都抢占锁并发执行效率低。3静态内部类最优写法• 实现私有静态内部类持有单例对象外部类方法返回内部类常量• 优势兼顾懒加载调用时才创建 天然线程安全无同步锁性能损耗生产最推荐。3. 工厂设计模式• 作用统一封装对象创建逻辑解耦new硬编码• 搭配反射通过配置文件反射动态创建对象实现工厂通用化• 配套工具Properties1. 继承Hashtable键值默认都是String2. load(流)读取配置文件自动按/:分割键值3. getProperty(key)根据键读取配置值。二、个人学习观点1. 反射是框架底层核心学习不能只记API要理解运行时动态特性初学容易觉得反射代码冗长、没必要但所有主流框架Spring IoC、MyBatis映射底层全靠反射实现。传统new是编译期写死对象类型反射能通过配置文件字符串动态创建任意类这是框架实现解耦、可配置的根本。同时反射暴力访问私有方法破坏封装日常业务开发尽量少用只在通用工具、框架层使用。2. Class对象三种获取方式适用场景区分很关键• 业务代码已知类优先类名.class性能最好• 已有实例对象用getClass()• 框架读取配置文件如properties只能用Class.forName()这也是面试高频考点。同时要注意反射创建对象必须处理无参构造的限制写实体类时养成保留无参构造的习惯避免框架运行报错。3. 单例三种实现方式的取舍逻辑清晰静态内部类是最优解饿汉、懒汉各有短板饿汉浪费内存同步懒汉并发性能差。静态内部类利用类加载机制天然保证线程安全又做到懒加载是生产环境标准写法。面试常考单例线程安全问题要理解synchronized同步锁的性能缺陷能主动说出静态内部类方案。4. 工厂模式反射Properties是一套完整通用解耦方案开发实用性极强普通工厂每新增类就要修改工厂代码违背开闭原则搭配反射配置文件后新增类只需要修改properties完全不用改动工厂代码这是解耦的经典实践。Properties作为配置文件读取工具和反射、工厂模式绑定使用是后端开发读取配置的基础组合需要熟练掌握load加载、getProperty取值流程。5. 反射与设计模式相辅相成是进阶Java的分水岭基础CRUD业务几乎用不到反射、设计模式但想要看懂框架源码、写出可复用通用工具必须吃透这两块内容。反射提供动态操作类的能力单例、工厂等设计模式规范对象创建逻辑二者结合才能写出低耦合、高拓展性的工程代码是从初级开发进阶中级开发的核心知识点。6. 学习避坑提醒1. 反射操作私有成员必须setAccessible(true)否则抛权限异常2. Class.forName()必须写全限定类名缺包名会报类找不到3. 懒汉单例不加同步锁会出现多线程多实例bug不能省略synchronized4. Properties存储键值均为String读取数字需要手动类型转换。
Java反射与设计模式
Java反射与设计模式笔记一、笔记核心知识点总结一反射1. 基础概念• 类的对象new 创建的实例承载业务数据一个类可以有多个。• 类对象Class对象类加载后生成唯一封装该类全部结构包名、父类、属性、方法、构造器一个类仅存在1份。• 反射运行时获取Class对象动态操作类的构造、方法、属性。2. 三种获取Class对象的方式1. 对象调用getClass()必须先实例化对象运行时获取。2. 类名.class编译期就能拿到无需实例化。3. Class.forName(全限定类名)传入包名类名字符串仅写类名会抛ClassNotFoundException会主动触发类加载框架配置文件常用。3. 类加载触发时机1. 首次new创建对象2. 首次访问静态变量/静态方法3. 子类加载会优先加载父类4. 反射Class.forName()获取Class对象。4. 反射核心操作API1. 获取类信息◦ getName()获取完整类名◦ getMethods()获取本类父类所有public方法◦ getDeclaredMethods()仅获取本类全部方法包含私有。2. 实例化对象◦ 无参构造c.newInstance()实体类建议提供无参构造否则抛实例化异常◦ 有参构造先getConstructor(参数类型.class)获取构造器再newInstance(实参)创建对象。3. 调用私有方法◦ getDeclaredMethod(方法名)拿到私有方法◦ setAccessible(true)暴力破除访问权限◦ invoke(实例对象)执行方法。5. 反射优缺点• ✅ 优点代码高度通用灵活Spring、MyBatis等底层框架核心依赖反射• ❌ 缺点代码繁琐、可读性差破坏面向对象封装特性。二设计模式笔记重点单例、工厂1. 设计模式定义行业通用、反复复用的代码解决方案共23种用于规范化代码结构、降低耦合。2. 单例模式保证JVM中仅存在该类一个实例1饿汉式• 实现类加载时直接创建静态常量对象私有构造器静态方法返回实例。• 优势无线程安全问题并发效率高• 劣势类加载就创建对象未使用也占用内存空间利用率低。2懒汉式同步锁版• 实现静态变量初始为null调用getInstance()时判断为空才创建方法加synchronized保证线程安全。• 优势使用时才创建节省内存• 劣势每次调用方法都抢占锁并发执行效率低。3静态内部类最优写法• 实现私有静态内部类持有单例对象外部类方法返回内部类常量• 优势兼顾懒加载调用时才创建 天然线程安全无同步锁性能损耗生产最推荐。3. 工厂设计模式• 作用统一封装对象创建逻辑解耦new硬编码• 搭配反射通过配置文件反射动态创建对象实现工厂通用化• 配套工具Properties1. 继承Hashtable键值默认都是String2. load(流)读取配置文件自动按/:分割键值3. getProperty(key)根据键读取配置值。二、个人学习观点1. 反射是框架底层核心学习不能只记API要理解运行时动态特性初学容易觉得反射代码冗长、没必要但所有主流框架Spring IoC、MyBatis映射底层全靠反射实现。传统new是编译期写死对象类型反射能通过配置文件字符串动态创建任意类这是框架实现解耦、可配置的根本。同时反射暴力访问私有方法破坏封装日常业务开发尽量少用只在通用工具、框架层使用。2. Class对象三种获取方式适用场景区分很关键• 业务代码已知类优先类名.class性能最好• 已有实例对象用getClass()• 框架读取配置文件如properties只能用Class.forName()这也是面试高频考点。同时要注意反射创建对象必须处理无参构造的限制写实体类时养成保留无参构造的习惯避免框架运行报错。3. 单例三种实现方式的取舍逻辑清晰静态内部类是最优解饿汉、懒汉各有短板饿汉浪费内存同步懒汉并发性能差。静态内部类利用类加载机制天然保证线程安全又做到懒加载是生产环境标准写法。面试常考单例线程安全问题要理解synchronized同步锁的性能缺陷能主动说出静态内部类方案。4. 工厂模式反射Properties是一套完整通用解耦方案开发实用性极强普通工厂每新增类就要修改工厂代码违背开闭原则搭配反射配置文件后新增类只需要修改properties完全不用改动工厂代码这是解耦的经典实践。Properties作为配置文件读取工具和反射、工厂模式绑定使用是后端开发读取配置的基础组合需要熟练掌握load加载、getProperty取值流程。5. 反射与设计模式相辅相成是进阶Java的分水岭基础CRUD业务几乎用不到反射、设计模式但想要看懂框架源码、写出可复用通用工具必须吃透这两块内容。反射提供动态操作类的能力单例、工厂等设计模式规范对象创建逻辑二者结合才能写出低耦合、高拓展性的工程代码是从初级开发进阶中级开发的核心知识点。6. 学习避坑提醒1. 反射操作私有成员必须setAccessible(true)否则抛权限异常2. Class.forName()必须写全限定类名缺包名会报类找不到3. 懒汉单例不加同步锁会出现多线程多实例bug不能省略synchronized4. Properties存储键值均为String读取数字需要手动类型转换。