前言
造轮计划
近期借助 SaaS 课程回顾了 Java 反射相关的知识,以及 Spring IOC 和 AOP 的基础知识。按照“能实现一定程度上代表能理解”的思想,尝试实现 ORM、IOC 和 AOP 三个常用轮子
再谈反射
反射是指在运行时动态地获取一个对象的信息以及操作对象的能力
这种操作的实现是通过对对象进行抽象(Class
是 class
的 class,class 的本质是通过描述实现多到一的抽象),再利用 Meta Object (Object 即 Data,Meta Object 即 MetaData)的描述信息复现对象,抽象使得流程细分成为可能,这种流程上的细分,使得运行时动态获取对象信息和操作对象成为可能
Java 中的反射机制
为静态语言赋予动态特性
Java 不是动态语言。动态语言是指在运行时可以动态地改变程序的结构和行为的语言,而Java是一种静态类型语言,它在编译时就需要确定变量的类型和方法的参数类型。Java的静态类型检查可以在编译时检查出类型错误,从而避免在运行时出现类型错误的情况。虽然Java提供了反射机制,可以在运行时动态地获取类的信息以及操作对象的能力,但是这并不意味着Java是动态语言。反射机制只是Java提供的一种灵活的编程方式,它可以在运行时动态地创建对象、调用方法、访问属性等,但是这并不改变Java是一种静态类型语言的本质。
反射的语法实现机制主要包括以下几个方面:
机制 | 描述 |
---|---|
Class类 | 代表一个类的信息,包括类的名称、属性、方法等 |
Constructor类 | 代表一个类的构造器信息,可以用来创建对象 |
Method类 | 代表一个类的方法信息,可以用来调用对象的方法 |
Field类 | 代表一个类的属性信息,可以用来访问对象的属性 |
Modifier类 | 用于获取和修改访问修饰符的信息 |
通过这些类,程序可以在运行时获取类的信息,并且可以在运行时动态地创建对象、调用方法、访问属性等。反射机制虽然灵活,但是也会带来一定的性能损失,因此在使用时需要谨慎。
关键
个人总结
通过反射机制提供运行时获取对象信息和操作对象的能力
通过注解机制提供运行时可获取的辅助信息
反射机制的作用
反射机制可以用来实现以下功能:
- 动态地创建对象:通过反射机制,可以在运行时动态地创建对象,而不需要在编译时就确定对象的类型。
- 动态地调用方法:通过反射机制,可以在运行时动态地调用对象的方法,而不需要在编译时就确定方法的名称和参数类型。
- 动态地访问属性:通过反射机制,可以在运行时动态地访问对象的属性,而不需要在编译时就确定属性的名称和类型。
- 动态地获取类的信息:通过反射机制,可以在运行时动态地获取类的信息,包括类的属性、方法、构造器等。
注解机制的作用
注解机制是 Java 中一种元数据机制,它可以在代码中添加元数据信息,以便于编译器、工具和框架进行解析和处理。注解机制可以用来实现以下功能:
- 标记代码:通过注解机制,可以在代码中添加标记,以便于编译器、工具和框架进行解析和处理。
- 配置代码:通过注解机制,可以在代码中添加配置信息,以便于编译器、工具和框架进行解析和处理。
- 生成代码:通过注解机制,可以在代码中添加生成代码的信息,以便于编译器、工具和框架进行生成代码。
ORM 实现
Object → Relation Table
基本映射关系
Object 对象 | Relation Table 关系表 |
---|---|
ClassName 类名 | TableName 表名 |
Field 字段 | Attribute 属性 |
操作方法 | SQL 语句 |
约束——SQL 语句特有特征
- NOT NULL
- UNIQUE
- PRIMARY KEY
FOREIGN KEY:暂不考虑CHECK:暂不考虑
反射相关方法积累
方法示例 | 方法作用 |
---|---|
Table table = obj.getClass().getAnnotation(Table.class) | 获取注解对象 |
table.value() | 获取注解对象中的value属性 |
Field[] fields = obj.getClass().getDeclaredFields() | 无视访问权限限制,获取对象字段 |
field.setAccessible(true) | 忽视访问权限限制,若不忽视,使用非 public 型字段会抛异常 |
field.getType() == String.class | 获取字段类型,并判断是否为 String |
field.get(obj) | 获取字段值 |
层流分析
ORM 结构
- 注解:提供辅助信息
- Table
- value:类名
- Column
- value:字段名称
- type:字段数据类型
- length:字段长度
- primaryKey:主键
- allowNull:是否为空
- unique:是否唯一
- Table
- 示例对象
- User
- id
- name
- User
- JDBC:连接 MYSQL 数据库,逐句执行指令
相当于 MYSQL 与 Java 程序之间的桥梁 - SQL 语句生成器:生成 SQL 语句
- Parser
- createTable():生成建表语句
- update():生成 UPDATE 语句
- delete():生成 DELETE 语句
- insert():生成 INSERT 语句
- select():生成 SELECT 语句
- Parser
ORM 流程
graph LR Example --调用--> Parser --生成SQL语句--> JDBC --提供SQL语句--> MYSQL源码地址
https://github.com/Ba11ooner/ORM_Demo
标签:语句,反射,Java,对象,造轮,ORM,计划,机制,动态 From: https://www.cnblogs.com/ba11ooner/p/17415875.html