Skip to content

Commit 694290b

Browse files
committedDec 6, 2019
Java高级特性 反射、泛型、注解和动态代理
1 parent 8356155 commit 694290b

File tree

10 files changed

+237
-25
lines changed

10 files changed

+237
-25
lines changed
 

‎.idea/workspace.xml

+40-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Annotation.png

17.3 KB
Loading

‎README.md

+113-17
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,36 @@
11
# mybatis-test
22
**mybatis源码研究-2019/12/04**
3+
4+
从整体到局部,最后再回到整体,从全局把控mybatis各个模块;深挖mybatis所有核心知识点,让你真正掌握mybatis核心设计思想;
35

6+
奉上[详细书签版mybatis技术内幕](#xml基础知识名称空间文档验证文档处理)
47
导航目录
58
=================
69

710
* [mybatis-test](#mybatis-test)
8-
* [XML基础知识(名称空间/文档验证/文档处理)](#xml基础知识名称空间文档验证文档处理)
9-
* [XML](#xml)
10-
* [XML名称空间](#xml名称空间)
11-
* [DTD(Document Type Definition)](#dtddocument-type-definition)
12-
* [系统标识符:](#系统标识符)
13-
* [公共标识符:](#公共标识符)
14-
* [DTD详述](#dtd详述)
15-
* [元素声明](#元素声明)
16-
* [一个元素内容模型定义了可允许的元素内容。](#一个元素内容模型定义了可允许的元素内容)
17-
* [基数是指这个元素在内容模型中出现的次数。DTD有4个基数指示符。](#基数是指这个元素在内容模型中出现的次数dtd有4个基数指示符)
18-
* [属性声明](#属性声明)
19-
* [schema](#schema)
11+
* [XML基础知识(名称空间/文档验证/文档处理)](#xml基础知识名称空间文档验证文档处理)
12+
* [XML](#xml)
13+
* [XML名称空间](#xml名称空间)
14+
* [DTD(Document Type Definition)](#dtddocument-type-definition)
15+
* [系统标识符:](#系统标识符)
16+
* [公共标识符:](#公共标识符)
17+
* [DTD详述](#dtd详述)
18+
* [元素声明](#元素声明)
19+
* [一个元素内容模型定义了可允许的元素内容。](#一个元素内容模型定义了可允许的元素内容)
20+
* [基数是指这个元素在内容模型中出现的次数。DTD有4个基数指示符。](#基数是指这个元素在内容模型中出现的次数dtd有4个基数指示符)
21+
* [属性声明](#属性声明)
22+
* [schema](#schema)
23+
* [Java高级特性](#java高级特性)
24+
* [再谈对象](#再谈对象)
25+
* [问题空间与解空间](#问题空间与解空间)
26+
* [面向对象特性](#面向对象特性)
27+
* [类型信息](#类型信息)
28+
* [反射操作---泛型、注解和动态代理](#反射操作---泛型注解和动态代理)
29+
* [注解:](#注解)
30+
* [泛型:](#泛型)
2031
* [<em><strong>mybatis思维导图</strong></em>](#mybatis思维导图)
2132
* [<em><strong>主要参考资料:</strong></em>](#主要参考资料)
2233

23-
2434
****
2535
***mybatis整体架构***
2636

@@ -102,6 +112,8 @@ ATTLIST包含三个部分:ATTLIST关键字 相应元素名 属性列表
102112
```
103113
上面例子指出book元素包含year属性,CDATA用来定义属性类型,#IMPLIED指出该属性不是必须的。
104114
`ref: https://www.w3school.com.cn/dtd/dtd_attributes.asp`
115+
http://mybatis.org/dtd/mybatis-3-config.dtd
116+
http://mybatis.org/dtd/mybatis-3-mapper.dtd
105117

106118
## schema
107119
XML Schema 参考手册:
@@ -205,12 +217,89 @@ FAQ. 自行比较DTD与XML schema
205217
FAQ. 阅读其他主题XPath、xslt、DOM、Java与xml等
206218
****
207219

208-
## ***mybatis思维导图***
220+
# Java高级特性
221+
[JAVA编程思想(第四版)ch01-对象导论](https://pan.baidu.com/s/1vbHMb3XRXato-jFv34HeQQ "验证码:p4th")
222+
## 再谈对象
223+
### 问题空间与解空间
224+
程序员必须建立起在机器模型(位于“解空间”内,这是你对问题建模的地方,例如计算机)和实际待解问题的模型(位于“问题空间”内,这是问题存
225+
在的地方,例如一项业务)之间的关联。
226+
面向对象方式将问题空间中的元素及其在解空间中的表示称为“对象”。这种思想的实质是:程序可以通过添加新类型的对象使自身适用与某个特定问题。
227+
这是一种更灵活更强有力的语言抽象。
228+
OOP中,用class关键字表示数据类型;类描述了具有相同特性(数据元素)和行为(功能)的对象集合,一个类实际上就是一个数据类型。(ch01-对象导论)
229+
### 面向对象特性
230+
***多态的本质***
231+
前期绑定:编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。OOP中,程序直到运行时才能确定代码地址
232+
当消息发送到一个泛化对象时,使用了后期绑定,编译器确保被调用方法的存在,并对调用参数和返回值致性类型检查(无法提供此类保证的语言被称为是弱类型的),
233+
但是并不知道将要执行的确切代码。Java的动态绑定是默认行为(C++通过virtual关键字明确声明某个方法后期绑定)不需要额外关键字实现多态。
234+
多态的作用是消除类型之间的耦合关系。多态通过分离做什么和怎么做,从另一个角度实现接口和实现分离(FAQ. 查阅OOP三大特性(ch08-多态))。
235+
“封装”通过合并特征和行为来创建新的数据类型。
236+
继承允许将对象视为它自己本身的类型或其基类型来加以处理。这种能力极为重要,因为它允许将多种类型(从同一基类导出的)视为同一类型,而同一份代码
237+
也就可以毫无差别地运行在这些不同类型之上了。
238+
多态方法调用根据方法行为的不同来表现类型之间的差别,尽管它们都可以通过同一个基类来调用。
239+
FAQ. 方法重载:what(表现形式)?why(为什么要重载方法)?who(怎么设计重载方法,如何查找到正确的方法来调用)?
240+
241+
## 类型信息
242+
每当编写并且编译一个新类就会产生一个Class对象,它被保存在一个同名的.class文件中。所有的类都是在对其第一次使用时,动态加载到JVM中的。
243+
无论何时,通过获得相应的Class对象的引用可以运行时使用类型信息。
244+
为使用类而做的准备工作包含三个步骤:
245+
加载,类加载器执行。该步骤将查找字节码,并从字节码中创建一个Class对象。
246+
链接,验证类中的字节码,为静态域分配存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用。
247+
初始化,如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。(类初始化是线程安全的)
248+
249+
### 反射操作---泛型、注解和动态代理
250+
#### 注解:
251+
一种标记,用于对java说明,注释。
252+
Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
253+
@Target,@Retention,@Documented,@Inherited
254+
Java语言对注解的支持:
255+
![Annotation](./Annotation.png "Annotation uml")
256+
257+
#### 泛型:
258+
泛型是jdk1.5引入的新特性,允许在定义类和接口的时候使用类型参数。
259+
***类型擦除***
260+
java的泛型基本是在编译器这个层次上实现的。在生成的java字节码中不包含泛型中的类型信息。
261+
使用泛型时加上的类型参数,会被编译器在编译时擦除。
262+
263+
类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。
264+
类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。
265+
类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。
266+
类型擦除的主要过程如下:
267+
1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
268+
2.移除所有的类型参数。
269+
270+
***泛型支持***
271+
为了表达泛型类型声明,JavaSE 5.0在java.lang.reflect包中提供了一个新的接口Type。这个接口包含下列子类型:
272+
```java
273+
GenericArrayType (java.lang.reflect)
274+
GenericArrayTypeImpl (com.sun.xml.internal.bind.v2.model.nav)
275+
GenericArrayTypeImpl (sun.reflect.generics.reflectiveObjects)
276+
GenericArrayTypeImpl in TypeParameterResolver (org.apache.ibatis.reflection)
277+
ParameterizedType (java.lang.reflect)
278+
ParameterizedTypeImpl in TypeParameterResolver (org.apache.ibatis.reflection)
279+
ParameterizedTypeImpl (com.sun.xml.internal.bind.v2.model.nav)
280+
ParameterizedTypeImpl (com.alibaba.fastjson.util)
281+
ParameterizedTypeImpl (sun.reflect.generics.reflectiveObjects)
282+
WildcardType (java.lang.reflect)
283+
WildcardTypeImpl (sun.reflect.generics.reflectiveObjects)
284+
WildcardTypeImpl in TypeParameterResolver (org.apache.ibatis.reflection)
285+
WildcardTypeImpl (com.sun.xml.internal.bind.v2.model.nav)
286+
WildcardTypeImpl (com.sun.beans)
287+
TypeVariable (java.lang.reflect)
288+
TypeVariableImpl (sun.reflect.generics.reflectiveObjects)
289+
Class (java.lang)
290+
```
291+
292+
***泛型与数组***
293+
泛型擦除会移除参数类型信息,数组必须知道所持有的确切类型,以强制保证类型安全。
294+
295+
296+
297+
# ***mybatis思维导图***
209298
> ![mybatis思维导图](./mybatis整体架构图01.png "mybatis思维导图")
210299
211-
## ***主要参考资料:***
300+
# ***主要参考资料:***
212301
> - [x] [MyBatis技术内幕 徐郡明 2017/07](https://pan.baidu.com/s/1-JGtoXADDjQRw5v51np4vA "提取码是fcak")
213-
> - [x] [MyBatis 3 源码深度解析 江荣波 2019/10](https://pan.baidu.com/s/1-JGtoXADDjQRw5v51np4vA "最新出版没有电子书")
302+
> - [x] [MyBatis 3 源码深度解析 江荣波 2019/10]
214303
> - [x] [MyBatis从入门到精通 刘增辉 2017/07](https://pan.baidu.com/s/1-JGtoXADDjQRw5v51np4vA "提取码是fcak")
215304
> - [x] [深入浅出MyBatis 技术原理与实战 杨开振 2016/09](https://pan.baidu.com/s/1-JGtoXADDjQRw5v51np4vA "提取码是fcak")
216305
> - [x] [xml](https://www.w3school.com.cn/xml/index.asp "W3CSchool")
@@ -220,6 +309,13 @@ FAQ. 阅读其他主题XPath、xslt、DOM、Java与xml等
220309
> - [x] [XML入门经典(第5版) 第I部分-->第III部分](https://pan.baidu.com/s/1M3HSfL3VQgpVvHa_ekUjvQ "提取码是9mfm")
221310
> - [x] [疯狂XML讲义](https://pan.baidu.com/s/1M3HSfL3VQgpVvHa_ekUjvQ "提取码是9mfm")
222311
> - [x] [XML揭秘 入门·应用·精通 Michael Morrison 陆新年](https://pan.baidu.com/s/1M3HSfL3VQgpVvHa_ekUjvQ "提取码是9mfm")
223-
> - [x] [《XML简明教程》2009年清华大学出版社出版 张欣毅](https://www.baidu.com "xml基础简明教程,没找到电子版。")
312+
> - [x] [《XML简明教程》2009年清华大学出版社出版 张欣毅]
224313
> - [x] [Java与XML](https://www.baidu.com "java访问xml")
314+
> - [x] [Java编程思想](https://pan.baidu.com/s/1Tz4rpgEwFg6Rcq9UqWTNOw "m912")
315+
> - [x] [Java核心技术I/II卷](https://pan.baidu.com/s/1Tz4rpgEwFg6Rcq9UqWTNOw "m912")
316+
> - [x] [C++程序设计教程(第二版) 钱能]
317+
> - [x] [深入理解Java虚拟机 JVM高级特性与最佳实践 第2版](https://pan.baidu.com/s/17mGl_Xu-dgWITfoD8V90HA "3tv9")
318+
> - [x] [Java深度历险](https://pan.baidu.com/s/1FTxaBmZPaiHKA4MPEF9p5g "rx5d")
319+
> - [x] [Java语言规范 基于Java SE 8](https://pan.baidu.com/s/1OSxrl5dZOvEHddAG4exNEA "wl1r")
320+
> - [x] [Java虚拟机规范 Java SE 8版](https://pan.baidu.com/s/14PjId4EJOHhyPxqQITaUTA "fvgs")
225321
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package org.pp.mybatis.foundationsupportlayer.reflector.beans;
2+
3+
import java.lang.reflect.Constructor;
4+
5+
/**
6+
*
7+
*/
8+
public class Person {
9+
private String name;
10+
private static volatile boolean flag = false;
11+
12+
private Person() {
13+
synchronized (Person.class) {
14+
if (!flag) {
15+
flag = true;
16+
} else {
17+
throw new RuntimeException("单例模式被侵犯!");
18+
}
19+
}
20+
}
21+
22+
public void say() {
23+
System.out.println("Person say: Hello World!");
24+
}
25+
26+
/**
27+
* 类初始化,在多线程环境下能被正确的加锁和同步
28+
*/
29+
private static class Holder {
30+
private static final Person person = new Person();
31+
}
32+
33+
public static final Person getInstance() {
34+
return Holder.person;
35+
}
36+
37+
public String getName() {
38+
return name;
39+
}
40+
41+
public void setName(String name) {
42+
this.name = name;
43+
}
44+
45+
public static void main(String[] args) {
46+
Class<Person> clazz1 = Person.class;
47+
Class<?> clazz2 = null;
48+
try {
49+
clazz2 = Class.forName("org.pp.mybatis.foundationsupportlayer.reflector.beans.Person");
50+
} catch (ClassNotFoundException e) {
51+
e.printStackTrace();
52+
}
53+
System.out.println("clazz1 == clazz2 " + (clazz1 == clazz2));
54+
55+
Person person1 = Person.getInstance();
56+
57+
Constructor<?> constructor = null;
58+
try {
59+
constructor = clazz2.getDeclaredConstructor();
60+
} catch (NoSuchMethodException e) {
61+
e.printStackTrace();
62+
}
63+
constructor.setAccessible(true);
64+
Person person = null;
65+
try {
66+
person = (Person) constructor.newInstance();
67+
} catch (Throwable throwable) {
68+
throwable.printStackTrace();
69+
70+
String strTemp = throwable.getStackTrace().toString();
71+
System.out.println(strTemp);
72+
StackTraceElement stackTraceElement = throwable.getStackTrace()[0];// 得到异常栈的首个元素
73+
74+
System.out.println("File=" + stackTraceElement.getFileName());// 打印文件名
75+
System.out.println("Line=" + stackTraceElement.getLineNumber());// 打印出错行号
76+
System.out.println("Method=" + stackTraceElement.getMethodName());// 打印出错方法
77+
}
78+
person1.say();
79+
}
80+
}

‎src/main/resources/mybatis-config.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
<!DOCTYPE configuration
33
PUBLIC "-//org.pp.mybatis.org//DTD Config 3.0//EN"
44
"http://mybatis.org/dtd/mybatis-3-config.dtd">
5-
5+
<!--<configuration-1>
6+
</configuration-1>-->
67
<configuration>
78
<properties resource="jdbc.properties"></properties>
89
<settings>

‎target/classes/mybatis-config.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
<!DOCTYPE configuration
33
PUBLIC "-//org.pp.mybatis.org//DTD Config 3.0//EN"
44
"http://mybatis.org/dtd/mybatis-3-config.dtd">
5-
5+
<!--<configuration-1>
6+
</configuration-1>-->
67
<configuration>
78
<properties resource="jdbc.properties"></properties>
89
<settings>
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)
Failed to load comments.