java反射
-
定义:
- 运行时动态获取类信息和调用方法的特性。
-
应用场景:
- JDBC数据库连接。
- 框架如Hibernate和Struts等。
-
实现方式:
-
通过四种方法获取Class对象:
Class.forName("类的路径")类名.class对象名.getClass()- 基本类型的包装类通过
Type属性获取Class对象。
-
-
核心类:
Class:获取类和接口信息。Field:获取属性信息和动态访问权限。Constructor:获取构造方法信息和访问权限。Method:获取方法信息。
-
优缺点:
-
优点:
- 运行时动态获取实例,提高灵活性。
- 可与动态编译结合。
-
缺点:
- 性能较低,因为需要解析字节码。
- 破坏封装性,可以访问私有方法和属性。
-
-
性能优化方案:
- 使用
setAccessible(true)关闭安全检查。 - 缓存Class对象以加快多次实例化速度。
- 使用
ReflectASM工具类通过字节码生成加速反射。
- 使用
List Set Map 区别
-
List:
- 存储元素的顺序是有序的。
- 可以包含重复的元素。
- 允许元素引用相同的对象。
-
Set:
- 不允许重复元素。
- 元素自动去重,不会有多个元素引用相同的对象。
- 无序的,但某些实现如
LinkedHashSet和TreeSet可以保持元素的插入顺序或自然排序顺序。
-
Map:
- 使用键值对存储数据。
- 每个键最多只能映射到一个值。
- 键不能重复,但值可以重复。
- 键通常使用
String类型,但也可以使用任何对象。 - Map不保证元素的顺序,但某些实现如
LinkedHashMap可以保持插入顺序。
Object 常用方法
-
clone 方法:
- 保护方法,用于实现对象的浅复制。
- 只有实现了
Cloneable接口的类才能调用此方法,否则会抛出CloneNotSupportedException。 - 实现深拷贝需要成员变量也为引用类型并实现
Cloneable,同时重写clone方法。
-
finalize 方法:
- 与垃圾收集器相关,用于判断对象是否可以被回收。
- 当对象即将被垃圾回收器回收时,由垃圾回收器调用此方法。
-
equals方法:
- 用于比较对象的等价性。
- 默认行为与
==相同,即比较对象的内存地址,通常需要在子类中重写。
-
hashCode 方法:
- 用于哈希查找,通常在重写
equals方法时也需要重写此方法。 - JDK 1.6和1.7默认返回随机数,而JDK 1.8使用Marsaglia's xorshift scheme算法生成随机数。
- 用于哈希查找,通常在重写
-
notifyAll方法:
- 与
synchronized关键字配合使用,唤醒在此对象上等待的所有线程。
- 与
-
toString和getClass方法:
toString方法用于返回对象的字符串表示,通常需要在子类中重写。getClass方法用于获取对象的运行时类信息,通常不需要讨论。