-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
204 lines (98 loc) · 137 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>博客总结</title>
<link href="/posts/a75fd34c.html"/>
<url>/posts/a75fd34c.html</url>
<content type="html"><![CDATA[<h1 id="博客总结"><a href="#博客总结" class="headerlink" title="博客总结"></a>博客总结</h1><h2 id="1-初衷以及为何不更新的原因"><a href="#1-初衷以及为何不更新的原因" class="headerlink" title="1. 初衷以及为何不更新的原因"></a>1. 初衷以及为何不更新的原因</h2><pre><code>这个博客是我当初大三的时候创建的。那时候个人对前端比较感兴趣一点,看到别人“花里胡哨”的博客,想着自己也得整一个,于是就有了这个博客。仅仅需要使用Hexo的几行代码就可以建立起自己的主页,并且有了github page也不需要自己单独租一个服务器了。遗憾的是,在我美化完自己的博客后,一直没有什么有价值的内容来进行分享,再加上自己的懈怠也没有再进行更新了。希望之后自己能重新使用好这一工具。</code></pre><h2 id="2-主题与个性化"><a href="#2-主题与个性化" class="headerlink" title="2. 主题与个性化"></a>2. 主题与个性化</h2><pre><code>因为我喜欢捣鼓样式,想要做的比较花哨,所以我选用了Hexo的butterfly主题,在该主题的基础上进行魔改。博客的总体风格偏向于卡通、唯美。</code></pre><h2 id="3-布局和设计思路"><a href="#3-布局和设计思路" class="headerlink" title="3. 布局和设计思路"></a>3. 布局和设计思路</h2><pre><code>布局上比较中规中矩,顶部是工具栏,可以进行全局搜索、查看时间轴、查看分类、标签、歌单等等。侧边栏展示我的个人信息、公告、时钟,还有一些有意思的小插件,并显示一些最新的文章。中间展示博客的所有文章、github calendar等</code></pre><h2 id="4-技术"><a href="#4-技术" class="headerlink" title="4. 技术"></a>4. 技术</h2><pre><code>主要是基于hexo框架,并且配置了github图床(jsdelivr cdn)、使用git action来自动部署、配置域名解析、gulp压缩静态资源、pwa优化、seo优化等。</code></pre><h2 id="5-过程中遇到的问题"><a href="#5-过程中遇到的问题" class="headerlink" title="5. 过程中遇到的问题"></a>5. 过程中遇到的问题</h2><pre><code>时常会有静态资源、插件不显示(例如看板娘、时钟等插件),git action莫名其妙报错等问题。不过在排查问题的过程中也能让我学到不少。例如静态资源的问题,多半是因为图床出了问题(之前用的unpkg cdn挂掉了),插件多半是因为版本迭代出现的bug。</code></pre>]]></content>
<categories>
<category> 👽开源软件通识 </category>
</categories>
<tags>
<tag> 👽开源软件通识 </tag>
</tags>
</entry>
<entry>
<title>计算机专业课程设计</title>
<link href="/posts/515907a4.html"/>
<url>/posts/515907a4.html</url>
<content type="html"><![CDATA[<h1 id="计算机专业课程设计"><a href="#计算机专业课程设计" class="headerlink" title="计算机专业课程设计"></a>计算机专业课程设计</h1><h2 id="1-进度安排"><a href="#1-进度安排" class="headerlink" title="1. 进度安排"></a>1. 进度安排</h2><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%93%E4%B8%9A%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1-image-20210705080531530.png" alt="image-20210705080531530"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%93%E4%B8%9A%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1-image-20210705080734520.png" alt="image-20210705080734520"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%93%E4%B8%9A%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1-image-20210705081152755.png" alt="image-20210705081152755"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%93%E4%B8%9A%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1-image-20210705081317463.png" alt="image-20210705081317463"></p><h1 id="2-考核方式"><a href="#2-考核方式" class="headerlink" title="2. 考核方式"></a>2. 考核方式</h1><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%93%E4%B8%9A%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1-image-20210705081549733.png" alt="image-20210705081549733"></p><h1 id="3-实验报告"><a href="#3-实验报告" class="headerlink" title="3. 实验报告"></a>3. 实验报告</h1><details ><summary> 报告格式 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%93%E4%B8%9A%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1-image-20210705081833642.png" alt="image-20210705081833642"></p> </div> </details>]]></content>
<categories>
<category> 🍞计算机课设 </category>
</categories>
<tags>
<tag> 🌹期末 </tag>
<tag> 😱短学期 </tag>
</tags>
</entry>
<entry>
<title>移动应用开发期末复习</title>
<link href="/posts/efd510a1.html"/>
<url>/posts/efd510a1.html</url>
<content type="html"><![CDATA[<h1 id="移动应用开发期末复习"><a href="#移动应用开发期末复习" class="headerlink" title="移动应用开发期末复习"></a>移动应用开发期末复习</h1><div class="tip faa-horizontal animated"><p>题型:</p><ol><li>简答题 * 4</li><li>编程题 * 3</li></ol><p>题目范围为下述<wavy>15道题</wavy> 中的任意7道。</p></div><h2 id="1-消息通知Toast-notification的使用方法"><a href="#1-消息通知Toast-notification的使用方法" class="headerlink" title="1. 消息通知Toast , notification的使用方法"></a>1. 消息通知Toast , notification的使用方法</h2><ol><li><p>消息提示Toast的使用</p><p>简单用法:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 第一个参数:当前的上下文环境。可用getApplicationContext()或this</span></span><br><span class="line"><span class="comment">// 第二个参数:要显示的字符串。也可是R.string中字符串ID</span></span><br><span class="line"><span class="comment">// 第三个参数:显示的时间长短。Toast默认的有两个LENGTH_LONG(长)和LENGTH_SHORT(短),也可以使用毫秒如2000ms</span></span><br><span class="line">Toast toast=Toast.makeText(getApplicationContext(), <span class="string">"默认的Toast"</span>, Toast.LENGTH_SHORT);</span><br><span class="line"><span class="comment">//显示toast信息</span></span><br><span class="line">toast.show();</span><br></pre></td></tr></table></figure><p>自定义位置的Toast</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">setGravity(int gravity, int xOffset, int yOffset)三个参数分别表示(起点位置,水平向右位移,垂直向下位移)</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line">Toast toast = Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">"这是自定义位置的Toast"</span>, Toast.LENGTH_LONG); </span><br><span class="line"> <span class="comment">//设置Toast在屏幕上显示的位置</span></span><br><span class="line"> toast.setGravity(Gravity.CENTER, <span class="number">20</span>,<span class="number">80</span>); </span><br><span class="line"> toast.show();</span><br></pre></td></tr></table></figure><p>自定义图标的Toast</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Toast toast = Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">"这是带图片的Toast"</span>, Toast.LENGTH_LONG); </span><br><span class="line"> <span class="comment">//创建一个子布局用于自定义Toast的内容</span></span><br><span class="line"> LinearLayout toastView = (LinearLayout) toast.getView(); </span><br><span class="line"> <span class="comment">//在这个子布局中定义一个ImageView用于添加Toast显示的图片</span></span><br><span class="line"> ImageView iv= <span class="keyword">new</span> ImageView(MainActivity.<span class="keyword">this</span>); </span><br><span class="line"> iv.setImageResource(R.drawable.p3); </span><br><span class="line"> <span class="comment">//把ImageView添加到子布局当中</span></span><br><span class="line"> toastView.addView(iv, <span class="number">0</span>); </span><br><span class="line"> toast.show();</span><br></pre></td></tr></table></figure></li><li><p>消息推送Notification的使用</p><p>主要步骤:</p><ol><li>创建通知栏管理工具NotificationManager</li><li>构建通知栏构造器Notification.Builder</li><li>给构造器设置参数</li><li>发送请求notify方法</li></ol><p>代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//发送简单的通知消息(含消息标题和内容)</span></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">sendSimpleNotify</span><span class="params">(String title,String message)</span></span>{</span><br><span class="line"> <span class="comment">//创建一个跳转到活动页面的意图Intent</span></span><br><span class="line"> <span class="comment">//Intent intent = new Intent(context, 目标activity.class);</span></span><br><span class="line"> Intent clickIntent = <span class="keyword">new</span> Intent(<span class="keyword">this</span>,MainActivity.class);</span><br><span class="line"> <span class="comment">//创建一个用于页面跳转的延迟意图</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> 第一个参数连接上下文的context</span></span><br><span class="line"><span class="comment">第二个参数是对PendingIntent的描述,请求值不同Intent就不同</span></span><br><span class="line"><span class="comment">第三个参数是一个Intent对象,包含跳转目标</span></span><br><span class="line"><span class="comment">第四个参数有4种状态</span></span><br><span class="line"><span class="comment">1.FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。</span></span><br><span class="line"><span class="comment">2.FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。</span></span><br><span class="line"><span class="comment">3.FLAG_ONE_SHOT:该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,那么如果你再调用send()方法的话,系统将会返回一个SendIntentException。</span></span><br><span class="line"><span class="comment">4.FLAG_UPDATE_CURRENT:如果系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> PendingIntent contentIntent = PendingIntent.getActivity(<span class="keyword">this</span>,R.string.app_name,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);</span><br><span class="line"> <span class="comment">//创建一个通知消息的构造器</span></span><br><span class="line"> Notification.Builder builder = <span class="keyword">new</span> Notification.Builder(<span class="keyword">this</span>);</span><br><span class="line"> builder.setContentIntent(contentIntent)<span class="comment">//设置内容的点击意图</span></span><br><span class="line"> .setAutoCancel(<span class="keyword">true</span>)<span class="comment">//设置是否允许自动清除</span></span><br><span class="line"> .setSmallIcon(R.drawable.ic_app)<span class="comment">//设置状态栏里的小图标(必须设置)</span></span><br><span class="line"> .setTicker(<span class="string">"提示消息来啦"</span>)<span class="comment">//设置状态栏里面的提示文本</span></span><br><span class="line"> .setWhen(System.currentTimeMillis())<span class="comment">//设置推送时间,格式:"小时:分钟"</span></span><br><span class="line"> <span class="comment">//设置通知栏的大图标</span></span><br><span class="line"> .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_app))</span><br><span class="line"> .setContentTitle(title)<span class="comment">//设置通知栏里面的标题文本</span></span><br><span class="line"> .setContentText(message);<span class="comment">//设置通知栏里面的内容文本</span></span><br><span class="line"> <span class="comment">//根据构造器构建一个通知对象</span></span><br><span class="line"> Notification notify = builder.build();</span><br><span class="line"><span class="comment">//从系统服务中获取通知管理器</span></span><br><span class="line"> NotificationManager notifyMgr = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);</span><br><span class="line"> <span class="comment">//使用通知管理器推送通知,然后在手机的通知栏就能看到信息</span></span><br><span class="line"> notifyMgr.notify(R.string.app_name,notify);</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>效果:</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E7%A7%BB%E5%8A%A8%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210628102049224.png" alt="image-20210628102728165"></p><p>如果你想要设置有计时功能(进度条)的消息通知,只需要将builder设置参数时,多设置以下三个参数</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">builder.setUsesChronometer(<span class="keyword">true</span>)<span class="comment">//设置是否显示计数器,设置了他得把原先设置的setWhen去掉</span></span><br><span class="line"> .setProgress(<span class="number">100</span>,<span class="number">60</span>,<span class="keyword">false</span>)<span class="comment">//设置进度条与当前进度(用了它就不可设置setSubText)</span></span><br><span class="line"> .setNumber(<span class="number">99</span>)<span class="comment">//设置通知栏右下方的数字(用了它就不可设置setContentInfo)</span></span><br></pre></td></tr></table></figure><p>效果如下:</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E7%A7%BB%E5%8A%A8%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210628102728165.png" alt="image-20210628102728165"></p></li></ol><h2 id="2-时间类开发组件-的使用方法"><a href="#2-时间类开发组件-的使用方法" class="headerlink" title="2. 时间类开发组件()的使用方法"></a>2. 时间类开发组件()的使用方法</h2><h2 id="3-可用项目代码展示对前端开发控件-单选按钮、多选按钮、下拉框的使用"><a href="#3-可用项目代码展示对前端开发控件-单选按钮、多选按钮、下拉框的使用" class="headerlink" title="3. 可用项目代码展示对前端开发控件:单选按钮、多选按钮、下拉框的使用"></a>3. 可用项目代码展示对前端开发控件:单选按钮、多选按钮、下拉框的使用</h2><h2 id="4-Volley机制的概念及使用步骤"><a href="#4-Volley机制的概念及使用步骤" class="headerlink" title="4. Volley机制的概念及使用步骤"></a>4. Volley机制的概念及使用步骤</h2><h2 id="5-关于Activity生命周期图,理解各状态以及之间的跳转关系"><a href="#5-关于Activity生命周期图,理解各状态以及之间的跳转关系" class="headerlink" title="5. 关于Activity生命周期图,理解各状态以及之间的跳转关系"></a>5. 关于Activity生命周期图,理解各状态以及之间的跳转关系</h2><h2 id="6-异步消息处理机制-的概念以及使用步骤"><a href="#6-异步消息处理机制-的概念以及使用步骤" class="headerlink" title="6. 异步消息处理机制()的概念以及使用步骤"></a>6. 异步消息处理机制()的概念以及使用步骤</h2><h2 id="7-Spinner-BaseAdapter的联合使用方式"><a href="#7-Spinner-BaseAdapter的联合使用方式" class="headerlink" title="7. Spinner + BaseAdapter的联合使用方式"></a>7. Spinner + BaseAdapter的联合使用方式</h2><h2 id="8-解析JSON数据的具体方法-用代码"><a href="#8-解析JSON数据的具体方法-用代码" class="headerlink" title="8. 解析JSON数据的具体方法(用代码)"></a>8. 解析JSON数据的具体方法(用代码)</h2><h2 id="9-Fragment的概念和具体实现方法"><a href="#9-Fragment的概念和具体实现方法" class="headerlink" title="9. Fragment的概念和具体实现方法"></a>9. Fragment的概念和具体实现方法</h2><h2 id="10-用代码展示使用第三方包-如-的使用方法与基本功能调用"><a href="#10-用代码展示使用第三方包-如-的使用方法与基本功能调用" class="headerlink" title="10. 用代码展示使用第三方包(如)的使用方法与基本功能调用"></a>10. 用代码展示使用第三方包(如)的使用方法与基本功能调用</h2><h2 id="11-用代码展示传感器类组件-如-的具体应用"><a href="#11-用代码展示传感器类组件-如-的具体应用" class="headerlink" title="11. 用代码展示传感器类组件(如)的具体应用"></a>11. 用代码展示传感器类组件(如)的具体应用</h2><h2 id="12-关于SharedPreference的使用方法"><a href="#12-关于SharedPreference的使用方法" class="headerlink" title="12. 关于SharedPreference的使用方法"></a>12. 关于SharedPreference的使用方法</h2><h2 id="13-能用代码展示对数据表的增删查改"><a href="#13-能用代码展示对数据表的增删查改" class="headerlink" title="13. 能用代码展示对数据表的增删查改()"></a>13. 能用代码展示对数据表的增删查改()</h2><h2 id="14-以购物车为例,对SqLite、共享参数、SD卡文件、全局内存详细阐述在什么场景下引用哪种方式存储,为什么"><a href="#14-以购物车为例,对SqLite、共享参数、SD卡文件、全局内存详细阐述在什么场景下引用哪种方式存储,为什么" class="headerlink" title="14. 以购物车为例,对SqLite、共享参数、SD卡文件、全局内存详细阐述在什么场景下引用哪种方式存储,为什么?"></a>14. 以购物车为例,对SqLite、共享参数、SD卡文件、全局内存详细阐述在什么场景下引用哪种方式存储,为什么?</h2><h2 id="15-对Service、Intent等核心组件,可用代码延时它们俩结合的具体应用"><a href="#15-对Service、Intent等核心组件,可用代码延时它们俩结合的具体应用" class="headerlink" title="15. 对Service、Intent等核心组件,可用代码延时它们俩结合的具体应用"></a>15. 对Service、Intent等核心组件,可用代码延时它们俩结合的具体应用</h2>]]></content>
<categories>
<category> 🌮移动应用开发 </category>
</categories>
<tags>
<tag> 🌹期末 </tag>
<tag> 🎁复习提纲 </tag>
<tag> 🤖安卓 </tag>
</tags>
</entry>
<entry>
<title>软件测试期末复习</title>
<link href="/posts/fb855ad7.html"/>
<url>/posts/fb855ad7.html</url>
<content type="html"><![CDATA[<h1 id="软件测试期末复习"><a href="#软件测试期末复习" class="headerlink" title="软件测试期末复习"></a>软件测试期末复习</h1><h2 id="1-开卷"><a href="#1-开卷" class="headerlink" title="1. 开卷"></a>1. 开卷</h2><ul><li>书: Selenium3自动化测试实战</li><li>纸质的课件: 自动化性能测试Loadrunner课件-2020.docx</li></ul><div class="tip warning faa-horizontal animated"><p><span class='p red h4'>其他纸质材料</span>不能带,不能带<wavy>电子设备</wavy></p></div><h2 id="2-题型"><a href="#2-题型" class="headerlink" title="2. 题型"></a>2. 题型</h2><ol><li>填空题</li><li>简答题</li><li>计算题</li><li>编程题</li></ol><h2 id="3-复习内容"><a href="#3-复习内容" class="headerlink" title="3. 复习内容"></a>3. 复习内容</h2><ol><li><p>自动化功能测试</p><span class='p green h4'>《Selenium3 自动化测试实战》</span>前11章(<wavy>不包括第10章</wavy>)</li><li><p>自动化性能测试</p><span class='p green h4'>《自动化性能测试Loadrunner课件-2020.docx》</span>全部内容,(<wavy>偏重于VUG</wavy>)</li></ol><div class="tip faa-horizontal animated"><p>自动化功能测试的比重略大于自动化性能测试。</p></div><div class="tag link"><a class="link-card" title="loadrunner课件下载地址" href="https://mooc1-1.chaoxing.com/coursedata/toPreview?courseId=217010042&dataId=310447029&objectId=ab4dd70e9004dd337db227e2643dbe79&classId=37897243&ut=s&cpi=77164481"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">loadrunner课件下载地址</p><p class="url">https://mooc1-1.chaoxing.com/coursedata/toPreview?courseId=217010042&dataId=310447029&objectId=ab4dd70e9004dd337db227e2643dbe79&classId=37897243&ut=s&cpi=77164481</p></div></a></div>]]></content>
<categories>
<category> 🏳🌈软件测试 </category>
</categories>
<tags>
<tag> 🌹期末 </tag>
<tag> 🎁复习提纲 </tag>
<tag> 🚀软件测试 </tag>
</tags>
</entry>
<entry>
<title>软件协同设计期末复习复习</title>
<link href="/posts/f01d39f1.html"/>
<url>/posts/f01d39f1.html</url>
<content type="html"><![CDATA[<h1 id="软件协同期末复习"><a href="#软件协同期末复习" class="headerlink" title="软件协同期末复习"></a>软件协同期末复习</h1><h2 id="1-团队有那几个角色,每个角色的职责是什么?"><a href="#1-团队有那几个角色,每个角色的职责是什么?" class="headerlink" title="1. 团队有那几个角色,每个角色的职责是什么???"></a>1. 团队有那几个角色,每个角色的职责是什么???</h2><ul><li><p>小组长</p><ul><li>团队建设</li><li>活动的组织</li><li>项目的审核以及总结</li></ul><span id="more"></span><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210616233346337-1624026462955.png" alt="image-20210616233346337"></p></li><li><p>开发经理</p><ul><li>项目的设计与实现</li></ul><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210616233548609-1624026462955.png" alt="image-20210616233548609"></p></li><li><p>计划经理</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210616234046030-1624026462956.png" alt="image-20210616234046030"></p><p>质量经理</p><ul><li><p>计划的制定以及监控</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210616234112469-1624026462956.png" alt="image-20210616234112469"></p></li></ul></li><li><p>测试经理</p><ul><li>项目的测试</li></ul></li><li><p>产品经理</p><ul><li>项目的需求分析</li></ul><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210616233500310-1624026462956.png" alt="image-20210616233500310"></p></li></ul><h2 id="2-计划阶段"><a href="#2-计划阶段" class="headerlink" title="2.计划阶段"></a>2.计划阶段</h2><ul><li><p>为什么要做计划?</p><div class="note info simple"><p>答: 没有计划的项目是<wavy>危险的</wavy></p><ul><li>软件项目中的任务众多(组件团队,需求分析,设计,采购。。。。)</li><li>制约软件项目的因素众多(时间,成本,质量,人员。。。)</li><li>软件项目容易产生: 软件危机</li><li>仿照生产计划——软件计划—–》保证软件开发</li></ul></div></li><li><p>要有多少种计划?课程中强调哪几种?</p><div class="note info simple"><p>答:</p><ul><li>项目范围管理计划</li><li>进度管理计划 (课程强调)</li><li>成本管理计划</li><li>质量管理计划 (课程强调)</li><li>过程改进计划</li><li>人力配备管理计划</li><li>沟通管理计划</li><li>风险管理计划</li><li>采购管理计划</li><li>合同管理计划</li><li>测试计划 (课程强调)</li></ul></div></li><li><p>计划的作用</p><div class="note info simple"><p>答: 为项目负责人提供一个框架,使之能<emp>合理地估算</emp>软件项目开发所需的资源 、经费和开发进度,并控制软件项目开发过程并按此计划进行。</p></div></li><li><p>通过哪几步制定计划</p><div class="note info simple"><ol><li>明确目标</li><li>制定项目工作范围</li><li>在项目组内分配任务职责</li><li>统筹规划项目间活动的关联</li></ol></div></li><li><p>W B S</p></li><li><p>每个计划包含的内容</p><ul><li><p>进度计划</p><ul><li><p>活动的定义</p><div class="note info simple"><p>活动: 是软件项目为产生各个可交付成果(如代码)所必须进行的具体活动,完成了这些活动意味着完成了WBS结构中的项目细目和子细目。<br>活动定义的目的是将软件项目工作分解为更小、更易管理的工作包,也叫活动或任务。这些小的活动应该是能够保障完成交付软件产品的可实施的详细任务。</p></div><table><thead><tr><th><strong>阶段名</strong></th><th><strong>编号</strong></th><th><strong>任务</strong></th></tr></thead><tbody><tr><td>启动</td><td>1</td><td>1、组建团队2、产品范围3、评审4、监管</td></tr><tr><td>计划</td><td>2</td><td>1、进度计划2、质量计划3、评审4、监管</td></tr><tr><td>需求</td><td>3</td><td>1、调研2、需求分析3、需求报告4、评审5、监管</td></tr><tr><td>设计</td><td>4</td><td>1、概要设计2、详细设计3、测试计划4、评审5、监管</td></tr><tr><td>编程</td><td>5</td><td>1、编程2、测试3、监管</td></tr><tr><td>交付</td><td>6</td><td>1、各类文档的编写2、系统的配置和调试3、培训</td></tr></tbody></table></li><li><p>活动排序</p></li><li><p>活动资源估算</p></li><li><p>活动持续时间估算</p></li><li><p>制定进度表</p></li><li><p>编制进度计划说明书</p></li></ul></li><li><p>质量计划</p><ul><li><p>质量目标</p></li><li><p>缺陷引入与排除率</p><div class="note info simple"><ul><li>缺陷引入率<br>程序员有一个共同的特点,他们都会引入许多缺陷。<br>在详细设计过程中会引入2个缺陷/小时<br>在编码程中会引入6个缺陷/小时。</li><li>缺陷排除比率<br>在设计复核过程中排除2个缺陷/小时<br>在代码复核过程中排除6个缺陷/小时</li></ul></div><ul><li><p>制定质量计划</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619145810989.png" alt="image-20210619145810989"></p></li><li><p>工作跟踪</p><ul><li>产生实际数据</li><li>记录每项工作的完成日期</li></ul></li></ul></li></ul></li><li><p>测试计划</p><ul><li>单元测试</li><li>集成测试</li><li>确认测试和系统测试的测试计划制定</li><li>测试用例设计</li><li>测试执行</li></ul></li></ul></li></ul><h2 id="3-系统需求分析阶段"><a href="#3-系统需求分析阶段" class="headerlink" title="3. 系统需求分析阶段"></a>3. 系统需求分析阶段</h2><ul><li><p>从哪几个方面对系统进行需求分析?</p><ul><li>系统用户的类型有哪些(角色)?</li><li>从角色出发获得系统的功能需求(必备,至少要有)</li><li>其他</li></ul></li><li><p>需要用到哪几个工具?</p><ul><li><p>用例图</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619155859921.png" alt="image-20210619155859921"></p><p><a href="https://www.jianshu.com/p/62a84cdc3faa">用例图教程</a></p></li><li><p>用例说明</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619155822882.png" alt="image-20210619155822882"></p></li><li><p>协作图</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619155922029.png" alt="image-20210619155922029"></p></li><li><p>E-R图</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E8%BD%AF%E4%BB%B6%E5%8D%8F%E5%90%8C%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619155942828.png" alt="image-20210619155942828"></p><p><a href="https://blog.csdn.net/chenpidaxia/article/details/62073162">E-R图教程</a></p></li></ul></li><li><p>需求报告</p><ul><li>包含哪几点</li><li>质量如何</li></ul></li></ul><h2 id="4-设计阶段"><a href="#4-设计阶段" class="headerlink" title="4. 设计阶段"></a>4. 设计阶段</h2><ul><li><p>设计哪几项</p><ul><li><p>系统平台确定</p><ul><li>开发环境</li><li>模式、架构(如M V C设计模式)<ul><li>页面设计</li><li>控制类设计</li><li>数据库设计</li></ul></li></ul></li><li><p>运行设计——时序图</p><p><a href="https://www.jianshu.com/p/c5209bde7287">时序图教程</a></p></li><li><p>给控制类画类图(包括关联)</p><p><a href="https://www.jianshu.com/p/57620b762160">类图教程1</a></p><p><a href="https://www.cnblogs.com/ubuntu1/p/9140055.html">类图教程2</a></p></li><li><p>活动图/流程图画类中方法的处理流程</p><ul><li><a href="https://blog.csdn.net/weixin_42119415/article/details/90474097">活动图教程</a></li><li><a href="https://www.jianshu.com/p/4a339e558b5f">流程图教程</a></li></ul></li></ul><h2 id="5-开发阶段与测试阶段"><a href="#5-开发阶段与测试阶段" class="headerlink" title="5. 开发阶段与测试阶段"></a>5. 开发阶段与测试阶段</h2></li><li><p>测试报告包含了哪些内容</p></li><li><p>测试用例正确理解,正确设定一个测试用例(重要)</p></li></ul><hr><h2 id="6-题型"><a href="#6-题型" class="headerlink" title="6. 题型"></a>6. 题型</h2><ul><li>简答题 <span class='p red'>50分</span><ul><li>如每个阶段用什么工具、制定计划哪几步?</li></ul></li><li>案例设计 <span class='p blue'>50分</span><ul><li>根据项目简介做<ul><li>需求分析</li><li>设计</li></ul></li></ul></li></ul>]]></content>
<categories>
<category> 💥软件协同设计 </category>
</categories>
<tags>
<tag> 🌹期末 </tag>
<tag> 🎁复习提纲 </tag>
<tag> 🐷软件协同设计 </tag>
</tags>
</entry>
<entry>
<title>嵌入式期末复习</title>
<link href="/posts/943e2d19.html"/>
<url>/posts/943e2d19.html</url>
<content type="html"><![CDATA[<h1 id="嵌入式期末复习"><a href="#嵌入式期末复习" class="headerlink" title="嵌入式期末复习"></a>嵌入式期末复习</h1><blockquote><p><strong>题型</strong>:</p><ul><li><strong>判断题</strong>(会有作业的单选和多选题)(10%)</li><li><strong>简答题</strong></li><li><strong>设计题</strong></li><li><strong>程序题</strong>(40%)</li></ul></blockquote><span id="more"></span><h2 id="1-判断题-10"><a href="#1-判断题-10" class="headerlink" title="1. 判断题(10%)"></a>1. 判断题(10%)</h2><ul><li>判断正误(复习作业)</li></ul><h2 id="2-简答题与设计题-50"><a href="#2-简答题与设计题-50" class="headerlink" title="2. 简答题与设计题(50%)"></a>2. 简答题与设计题(50%)</h2><ul><li>基本概念、简答、简单外设驱动(如KEY、LED接口设计和驱动程序设计,通过GPIO模拟时序信号的程序设计(参考LCD的时序控制))</li><li>概念、简答中ucos-II相关30%,ARM Cortex M3内核特点10%,简单外设10%</li></ul><h2 id="3-基于ucos-II的多任务程序设计(40-)"><a href="#3-基于ucos-II的多任务程序设计(40-)" class="headerlink" title="3. 基于ucos-II的多任务程序设计(40%)"></a>3. 基于ucos-II的多任务程序设计(40%)</h2><ol><li>任务分配</li><li>任务优先级、堆栈分配</li><li>main函数编写</li><li>任务间的通讯机制:信号量、邮箱、消息队列的使用(建立、post、pend)</li><li>任务代码</li><li>任务占用CPU的时序图</li></ol><hr><h1 id="一些重点"><a href="#一些重点" class="headerlink" title="一些重点"></a>一些重点</h1><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">OS.EVENT * mySem,myBox;</span><br><span class="line">main() {</span><br><span class="line"> OSTaskCreate(sp,一个参数);</span><br><span class="line"> 任务名称、堆栈指针(顶)、分配堆栈、优先级、任务代码</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>简答题 <strong>p p t 全有</strong></p></blockquote><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-9E42F84B69AF2E020CAB13CC8796997F-1624026367098.jpg" alt="img"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-D0DBC768767751AFBA2C89AD6D04B9B6-1624026367099.jpg" alt="img"></p><h2 id="点灯的细节"><a href="#点灯的细节" class="headerlink" title="点灯的细节"></a>点灯的细节</h2><blockquote><p>p33 —-p3口第三引脚</p><p>ARM 32位字长</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-14BC44A5034B4BD3FF447FCF77146BF4-1624026367099.jpg" alt="img"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-9C00BD22061AEE082D8DCFE36105878F-1624026367099.jpg" alt="img"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-E2C273CEB24BAECB70A614F923E6C4C0-1624026367099.jpg" alt="img"></p></blockquote><h2 id="等待列表和就绪表的计算"><a href="#等待列表和就绪表的计算" class="headerlink" title="等待列表和就绪表的计算"></a><em>等待列表</em>和<em>就绪表</em>的计算</h2><div class="tag link"><a class="link-card" title="震惊!小白都能看懂的就绪表计算方法" href="https://www.cnblogs.com/ply616/p/5713246.html"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">震惊!小白都能看懂的就绪表计算方法</p><p class="url">https://www.cnblogs.com/ply616/p/5713246.html</p></div></a></div><h2 id="中断"><a href="#中断" class="headerlink" title="中断"></a>中断</h2><blockquote><p>中断用<strong>MSP</strong></p><p>MSP 特权级堆栈指针</p><p>PSP 用户级堆栈指针</p><p>中断服务程序不可以创建任务、分配堆栈、设置延时等</p><p>调用了lock函数的任务不可以调用任何使它挂起的函数</p></blockquote><h2 id="参考复习资料"><a href="#参考复习资料" class="headerlink" title="参考复习资料"></a>参考复习资料</h2><div class="tag link"><a class="link-card" title="Curren学长整理的复习题" href="https://zhuanlan.zhihu.com/p/190248790"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">Curren学长整理的复习题</p><p class="url">https://zhuanlan.zhihu.com/p/190248790</p></div></a></div>]]></content>
<categories>
<category> 🌮嵌入式技术 </category>
</categories>
<tags>
<tag> 🍟嵌入式 </tag>
<tag> 🌹期末 </tag>
<tag> 🎁复习提纲 </tag>
</tags>
</entry>
<entry>
<title>分布式期末复习</title>
<link href="/posts/caa2d1e2.html"/>
<url>/posts/caa2d1e2.html</url>
<content type="html"><![CDATA[<h1 id="分布式计算期末复习"><a href="#分布式计算期末复习" class="headerlink" title="分布式计算期末复习"></a>分布式计算期末复习</h1><hr><blockquote><p>闭卷考A/B卷</p></blockquote><ol><li><strong>问答题</strong> * 4 —— 33%</li><li><strong>案例应用题</strong> * 3 —— 33%<ul><li>设计思路</li><li>框架</li></ul></li><li><strong>代码题</strong> * 4 —— 33%</li></ol><hr><span id="more"></span><h2 id="1-JAVA编程基础"><a href="#1-JAVA编程基础" class="headerlink" title="1. JAVA编程基础"></a>1. JAVA编程基础</h2><ul><li><p>Lambda表达式,能将代码改成Lambda表达式</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 1. 不需要参数,返回值为 5 </span></span><br><span class="line">() -> <span class="number">5</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">// 2. 接收一个参数(数字类型),返回其2倍的值 </span></span><br><span class="line">x -> <span class="number">2</span> * x </span><br><span class="line"></span><br><span class="line"><span class="comment">// 3. 接受2个参数(数字),并返回他们的差值 </span></span><br><span class="line">(x, y) -> x – y </span><br><span class="line"></span><br><span class="line"><span class="comment">// 4. 接收2个int型整数,返回他们的和 </span></span><br><span class="line">(<span class="keyword">int</span> x, <span class="keyword">int</span> y) -> x + y </span><br><span class="line"></span><br><span class="line"><span class="comment">// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) </span></span><br><span class="line">(String s) -> System.out.print(s)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 大括号中的返回语句</span></span><br><span class="line">MathOperation multiplication = (<span class="keyword">int</span> a, <span class="keyword">int</span> b) -> { <span class="keyword">return</span> a * b; };</span><br></pre></td></tr></table></figure><p><strong>例题</strong></p><p>原始代码:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.awt.BorderLayout;</span><br><span class="line"><span class="keyword">import</span> java.awt.event.*;</span><br><span class="line"><span class="keyword">import</span> javax.swing.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Ex8_10_UseButtonEvent</span> </span>{</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line">JFrame frm = <span class="keyword">new</span> JFrame(<span class="string">"实验1"</span>);</span><br><span class="line">frm.setLayout(<span class="keyword">new</span> BorderLayout());</span><br><span class="line">JButton btn = <span class="keyword">new</span> JButton(<span class="string">"按钮"</span>);</span><br><span class="line">frm.getContentPane().add(btn);</span><br><span class="line">ButtonHandler btnHandler = <span class="keyword">new</span> ButtonHandler();</span><br><span class="line">btn.addActionListener(btnHandler); </span><br><span class="line"></span><br><span class="line">frm.setBounds(<span class="number">400</span>, <span class="number">200</span>, <span class="number">400</span>, <span class="number">200</span>);</span><br><span class="line">frm.setVisible(<span class="keyword">true</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="comment">//将其修改为箭头函数</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ButtonHandler</span> <span class="keyword">implements</span> <span class="title">ActionListener</span> </span>{</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">actionPerformed</span><span class="params">(ActionEvent e)</span> </span>{</span><br><span class="line">System.out.println(<span class="string">"点击按钮"</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>修改后:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.USST.Tamiflu;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.awt.BorderLayout;</span><br><span class="line"><span class="keyword">import</span> java.awt.event.*;</span><br><span class="line"><span class="keyword">import</span> javax.swing.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Ex8_10_UseButtonEvent</span> </span>{</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line">JFrame frm = <span class="keyword">new</span> JFrame(<span class="string">"实验1"</span>);</span><br><span class="line">frm.setLayout(<span class="keyword">new</span> BorderLayout());</span><br><span class="line"></span><br><span class="line"><span class="comment">// lambda修改事件处理</span></span><br><span class="line">JButton btn = <span class="keyword">new</span> JButton(<span class="string">"按钮"</span>);</span><br><span class="line">frm.getContentPane().add(btn);</span><br><span class="line"><span class="comment">//lambda表达式</span></span><br><span class="line">btn.addActionListener((e) -> {</span><br><span class="line">System.out.println(<span class="string">"点击按钮"</span>);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">frm.setBounds(<span class="number">400</span>, <span class="number">200</span>, <span class="number">400</span>, <span class="number">200</span>);</span><br><span class="line">frm.setVisible(<span class="keyword">true</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>泛型能看懂</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> 1:把泛型定义在类上</span></span><br><span class="line"><span class="comment"> 2:类型变量定义在类上,方法中也可以使用</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ObjectTool</span><<span class="title">T</span>> </span>{</span><br><span class="line"> <span class="keyword">private</span> T obj;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> T <span class="title">getObj</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> obj;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setObj</span><span class="params">(T obj)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.obj = obj;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><h2 id="2-JAVA高级功能"><a href="#2-JAVA高级功能" class="headerlink" title="2. JAVA高级功能"></a>2. JAVA高级功能</h2><ul><li><p>会写反射代码(给你相关类和方法,按要求将类实例化对象,<wavy>用反射来实例化成对象</wavy>,<wavy>用反射去调用方法(有参/无参)和成员变量</wavy>,<emp>不可直接new!</emp>)</p><div class="tip faa-horizontal animated"><p><span class='p red h4'>JAVA反射机制</span>是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为<emp>java语言的反射机制</emp>。</p></div><ol><li><p>反射获取Class对象</p><details green open><summary> 查看如何用反射获取Class并生成实例 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622094333162.png" alt="image-20210622094333162"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619194644783.png" alt="image-20210619194644783"></p> </div> </details></li><li><p>反射获取类的方法并调用</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//获得当前类以及超类的public Method:</span></span><br><span class="line">Method[] arrMethods = classType. getMethods();</span><br><span class="line"><span class="comment">//获得当前类申明的所有Method:</span></span><br><span class="line">Method[] arrMethods = classType. getDeclaredMethods();</span><br><span class="line"><span class="comment">//获得当前类以及超类指定的public Method:</span></span><br><span class="line">Method method = classType. getMethod(String name, Class<?>... parameterTypes);</span><br><span class="line"><span class="comment">//获得当前类申明的指定的Method:</span></span><br><span class="line">Method method = classType. getDeclaredMethod(String name, Class<?>... parameterTypes) </span><br><span class="line"><span class="comment">//通过反射动态运行指定Method,Class... args为可变长参数写法(可当成可变长数组):</span></span><br><span class="line">Object obj = method. invoke(Object obj, Object... args) </span><br><span class="line"></span><br></pre></td></tr></table></figure><details green open><summary> 查看反射调用类方法的案例 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619200707202.png" alt="image-20210619200707202"></p> </div> </details></li><li><p>利用反射获取类的属性以及调用对象的getter和setter</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//获得当前类以及超类的public Field:</span></span><br><span class="line">Field[] arrFields = classType. getFields();</span><br><span class="line"><span class="comment">//获得当前类申明的所有Field:</span></span><br><span class="line">Field[] arrFields = classType. getDeclaredFields();</span><br><span class="line"><span class="comment">//获得当前类以及超类指定的public Field:</span></span><br><span class="line">Field field = classType. getField(String name);</span><br><span class="line"><span class="comment">//获得当前类申明的指定的Field:</span></span><br><span class="line">Field field = classType. getDeclaredField(String name); </span><br><span class="line"><span class="comment">//通过反射动态设定Field的值:</span></span><br><span class="line">fieldType.set(Object obj, Object value);</span><br><span class="line"><span class="comment">//通过反射动态获取Field的值: </span></span><br><span class="line">Object obj = fieldType. get(Object obj) ;</span><br><span class="line"></span><br></pre></td></tr></table></figure><details green open><summary> 查看反射获取属性并调用getter和setter案例 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619201231566.png" alt="image-20210619201231566"></p> </div> </details></li><li><p>总结</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619201703906.png" alt="image-20210619201703906"></p></li><li><p>综合案例</p><details green><summary> 查看反射的综合案例 </summary> <div class='content'> <p>当前Cat类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Cat</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> Integer age;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="title">Cat</span><span class="params">(String name, Integer age)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.name = name;</span><br><span class="line"> <span class="keyword">this</span>.age = age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">say</span><span class="params">(String words)</span> </span>{</span><br><span class="line"> System.out.println(<span class="string">"我是一只猫"</span> + words);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">toString</span><span class="params">()</span> </span>{</span><br><span class="line"> System.out.println(<span class="string">"Cat{"</span> +</span><br><span class="line"> <span class="string">"name='"</span> + name + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">", age="</span> + age +</span><br><span class="line"> <span class="string">'}'</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Cat{"</span> +</span><br><span class="line"> <span class="string">"name='"</span> + name + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">", age="</span> + age +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>通过反射获取带参构造函数并实例化对象</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">reflex1</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>{</span><br><span class="line"> <span class="comment">//获取字节码文件</span></span><br><span class="line"> Class<Cat> clazz = Cat.class;</span><br><span class="line"> <span class="comment">//获取参数第一个为String类型和第二个为Integer类型的构造方法</span></span><br><span class="line"> Constructor<Cat> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);</span><br><span class="line"> <span class="comment">//使用时取消 Java 语言访问检查</span></span><br><span class="line"> constructor.setAccessible(<span class="keyword">true</span>);</span><br><span class="line"> <span class="comment">//传参</span></span><br><span class="line"> Cat cat = constructor.newInstance(<span class="string">"咖菲猫"</span>, <span class="number">10</span>);</span><br><span class="line"> System.out.println(cat);</span><br><span class="line"> }</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">控制台打印:</span></span><br><span class="line"><span class="comment">Cat{name=‘咖菲猫’, age=10}</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><p>反射获取属性值并赋值</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">reflex2</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>{</span><br><span class="line"> <span class="comment">//获取字节码文件</span></span><br><span class="line"> Class<Cat> clazz = Cat.class;</span><br><span class="line"> <span class="comment">//获取参数第一个为String类型和第二个为Integer类型的构造方法</span></span><br><span class="line"> Constructor<Cat> constructor = clazz.getDeclaredConstructor();</span><br><span class="line"> <span class="comment">//使用时取消 Java 语言访问检查</span></span><br><span class="line"> constructor.setAccessible(<span class="keyword">true</span>);</span><br><span class="line"> <span class="comment">//实例化对象</span></span><br><span class="line"> Cat cat = constructor.newInstance();</span><br><span class="line"> <span class="comment">//获取所有字段数组</span></span><br><span class="line"> Field[] fields = clazz.getDeclaredFields();</span><br><span class="line"> <span class="keyword">for</span> (Field field : fields) {</span><br><span class="line"> <span class="comment">//打印字段名和类型</span></span><br><span class="line"> System.out.println(<span class="string">"字段名="</span> + field.getName() + <span class="string">"字段类型="</span> + field.getType());</span><br><span class="line"> field.setAccessible(<span class="keyword">true</span>);</span><br><span class="line"> <span class="keyword">if</span> (field.getType().equals(String.class)) {</span><br><span class="line"> field.set(cat, <span class="string">"咖菲猫"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (field.getType().equals(Integer.class)) {</span><br><span class="line"> field.set(cat, <span class="number">11</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(cat);</span><br><span class="line"> }</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">控制台打印:</span></span><br><span class="line"><span class="comment">字段名=name字段类型=class java.lang.String</span></span><br><span class="line"><span class="comment">字段名=age字段类型=class java.lang.Integer</span></span><br><span class="line"><span class="comment">Cat{name=‘咖菲猫’, age=11}</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><p>通过反射调用所有方法</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">reflex3</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>{</span><br><span class="line"> <span class="comment">//获取字节码文件</span></span><br><span class="line"> Class<Cat> clazz = Cat.class;</span><br><span class="line"> <span class="comment">//获取参数第一个为String类型和第二个为Integer类型的构造方法</span></span><br><span class="line"> Constructor<Cat> constructor = clazz.getDeclaredConstructor();</span><br><span class="line"> <span class="comment">//使用时取消 Java 语言访问检查</span></span><br><span class="line"> constructor.setAccessible(<span class="keyword">true</span>);</span><br><span class="line"> <span class="comment">//实例化对象</span></span><br><span class="line"> Cat cat = constructor.newInstance();</span><br><span class="line"> <span class="comment">//获取所有方法名 但不包括继承的方法</span></span><br><span class="line"> Method[] methods = clazz.getDeclaredMethods();</span><br><span class="line"> <span class="keyword">for</span> (Method method : methods) {</span><br><span class="line"> System.out.println(<span class="string">"方法名="</span> + method.getName());</span><br><span class="line"> }</span><br><span class="line"> Method[] sayMethod = clazz.getDeclaredMethod(<span class="string">"say"</span>,<span class="keyword">new</span> Class<?>[]{String.class});</span><br><span class="line"> sayMethod.setAccessible(<span class="keyword">true</span>);</span><br><span class="line"> sayMethod.invoke(cat,<span class="keyword">new</span> Object[]{<span class="string">"喵喵"</span>});</span><br><span class="line"> }</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">控制台打印:</span></span><br><span class="line"><span class="comment">方法名=toString</span></span><br><span class="line"><span class="comment">方法名=say</span></span><br><span class="line"><span class="comment">我是一只猫喵喵</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure> </div> </details></li></ol></li><li><p>依赖注入DI和控制反转 I O C 的代码以及概念</p><ul><li><p>什么是依赖注入(来源于DIP依赖倒置)</p><div class="tip faa-horizontal animated"><p><span class='p red h4'>依赖注入DI(Dependency Injection)</span> :所依赖的对象由外部IOC容器注入进去</p></div></li><li><p>什么是DIP</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210619202946638.png" alt="image-20210619202946638"></p><p>可以<emp>减少类与类之间的耦合性</emp>,提高系统<span class='p blue'>稳定性</span>、<span class='p red'>可读性</span> 、<span class='p green'>可维护性</span>, 通常利用IOC来实现DIP,DI是IOC的一个具体实现方式。</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-7305208-1db15d7c5583c55b.jpg" alt="img"></p><div class="tag link"><a class="link-card" title="不错的DIP与DI教程" href="https://blog.csdn.net/u011857683/article/details/80287274"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">不错的DIP与DI教程</p><p class="url">https://blog.csdn.net/u011857683/article/details/80287274</p></div></a></div><div class="tag link"><a class="link-card" title="不错的DIP与DI教程2" href="https://www.jianshu.com/p/db042e29143d"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">不错的DIP与DI教程2</p><p class="url">https://www.jianshu.com/p/db042e29143d</p></div></a></div></li><li><p>优点,解决了什么问题(解决了DIP)</p><ol><li>从代码中隔离对象创建过程,使代码更加干净和可读。</li><li>使模块100%松耦合。</li><li>交换依赖关系只是配置问题 - 代码中不需要进行任何更改。</li></ol></li><li><p>如何反转控制(IOC)?(用DI)</p><details green><summary> 案例(了解即可) </summary> <div class='content'> <p>案例: 利用IOC容器,将输入的指定对象(名),通过依赖注入实例化相应的对象。</p><ol><li><p>配置文件config.properties</p><figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">Train</span>=<span class="string">com.USST.Tamiflu.Train</span></span><br><span class="line"><span class="attr">Plane</span>=<span class="string">com.USST.Tamiflu.Plane</span></span><br><span class="line"><span class="meta">火车</span>=<span class="string">com.USST.Tamiflu.Train</span></span><br><span class="line"><span class="meta">飞机</span>=<span class="string">com.USST.Tamiflu.Plane</span></span><br></pre></td></tr></table></figure></li><li><p>IOC容器IOCContain</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.USST.Tamiflu;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.util.Properties;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">IOCContain</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> String filePath;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">IOCContain</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.filePath = <span class="string">"F:\\JavaWeb-master\\IOCTest\\src\\com\\USST\\Tamiflu\\config.properties"</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> Object <span class="title">getObject</span><span class="params">(String objName)</span> <span class="keyword">throws</span> FileNotFoundException, UnsupportedEncodingException </span>{</span><br><span class="line"><span class="comment">// 初始化对象</span></span><br><span class="line"> Object obj = <span class="keyword">null</span>;</span><br><span class="line"> Class cls = <span class="keyword">null</span>;</span><br><span class="line"><span class="comment">// 读取配置文件,获取完整类名</span></span><br><span class="line"> Properties properties = <span class="keyword">new</span> Properties();</span><br><span class="line"> InputStreamReader isr = <span class="keyword">new</span> InputStreamReader(<span class="keyword">new</span> FileInputStream(filePath), <span class="string">"GBK"</span>);</span><br><span class="line"> BufferedReader read = <span class="keyword">new</span> BufferedReader(isr);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> properties.load(read);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> String fullname = properties.getProperty(objName);</span><br><span class="line"><span class="comment">// 根据全类名,利用反射实例化对象</span></span><br><span class="line"> <span class="comment">//加载类</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> cls = Class.forName(fullname);</span><br><span class="line"> obj = cls.newInstance();</span><br><span class="line"> } <span class="keyword">catch</span> (ClassNotFoundException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">catch</span> (IllegalAccessException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">catch</span> (InstantiationException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> obj;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>Transport接口</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.USST.Tamiflu;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">Transport</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">startup</span><span class="params">()</span></span>;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>Plane类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.USST.Tamiflu;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Plane</span> <span class="keyword">implements</span> <span class="title">Transport</span> </span>{</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">startup</span><span class="params">()</span> </span>{</span><br><span class="line"> System.out.println(<span class="string">"飞机出发"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>Train类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.USST.Tamiflu;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Train</span> <span class="keyword">implements</span> <span class="title">Transport</span> </span>{</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">startup</span><span class="params">()</span> </span>{</span><br><span class="line"> System.out.println(<span class="string">"火车出发!"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>主函数</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.USST.Tamiflu;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> jdk.internal.util.xml.impl.Input;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"><span class="keyword">import</span> java.io.UnsupportedEncodingException;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.InvocationTargetException;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> FileNotFoundException, UnsupportedEncodingException, NoSuchMethodException, InvocationTargetException, IllegalAccessException </span>{</span><br><span class="line"><span class="comment">// write your code here</span></span><br><span class="line"> String classname = <span class="string">""</span>;</span><br><span class="line"> Object transport = <span class="keyword">null</span>;</span><br><span class="line"> IOCContain IOC = <span class="keyword">new</span> IOCContain();</span><br><span class="line"> Scanner input = <span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> classname = input.nextLine();</span><br><span class="line"> <span class="keyword">while</span>(!classname.equals(<span class="string">"0"</span>)) {</span><br><span class="line"> transport= IOC.getObject(classname);</span><br><span class="line"> Method method = transport.getClass().getMethod(<span class="string">"startup"</span>);</span><br><span class="line"> method.invoke(transport);</span><br><span class="line"> classname = input.nextLine();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ol> </div> </details></li><li><p>依赖注入常见的方式(主要是前两种构造函数注入和setter注入),会写代码</p><ol><li><p>构造函数中注入</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">StupidStudent</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> SmartStudent smartStudent;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">StupidStudent</span><span class="params">(SmartStudent smartStudent)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.smartStudent = smartStudent;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">doHomewrok</span><span class="params">()</span> </span>{</span><br><span class="line"> smartStudent.doHomework();</span><br><span class="line"> System.out.println(<span class="string">"学渣抄作业"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>构造器注入</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">StudentTest</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> SmartStudent smartStudent = <span class="keyword">new</span> SmartStudent();</span><br><span class="line"> StupidStudent stupidStudent = <span class="keyword">new</span> StupidStudent(smartStudent);</span><br><span class="line"> stupidStudent.doHomework();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>setter方式注入</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">StupidStudent</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> SmartStudent smartStudent;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setSmartStudent</span><span class="params">(SmartStudent smartStudent)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.smartStudent = smartStudent;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">doHomewrok</span><span class="params">()</span> </span>{</span><br><span class="line"> smartStudent.doHomework();</span><br><span class="line"> System.out.println(<span class="string">"学渣抄作业"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>setter注入</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">StudentTest</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> SmartStudent smartStudent = <span class="keyword">new</span> SmartStudent();</span><br><span class="line"> StupidStudent stupidStudent = <span class="keyword">new</span> StupidStudent();</span><br><span class="line"> stupidStudent.setSmartStudent(smartStudent);</span><br><span class="line"> stupidStudent.doHomework();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>接口注入</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">StupidStudent</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">doHomewrok</span><span class="params">(SmartStudent smartStudent)</span> </span>{</span><br><span class="line"> smartStudent.doHomework();</span><br><span class="line"> System.out.println(<span class="string">"学渣抄作业"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>接口注入</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">StudentTest</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> SmartStudent smartStudent = <span class="keyword">new</span> SmartStudent();</span><br><span class="line"> StupidStudent stupidStudent = <span class="keyword">new</span> StupidStudent();</span><br><span class="line"> stupidStudent.doHomework(smartStudent);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ol></li><li><p>代码题: 用依赖注入改写程序</p></li></ul></li><li><p>代理模式</p><ul><li><p>A O P是代理模式的重要应用</p></li><li><p>代理模式的概念</p><details green><summary> 代理模式一系列概念 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622163057818.png" alt="image-20210622163057818"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622163114438.png" alt="image-20210622163114438"></p> </div> </details></li><li><p>静态代理与动态代理(动态更重要)</p><ul><li><p>静态代理</p><div class="tip faa-horizontal animated"><p><span class='p red h4'>静态代理</span>:代理和被代理对象在代理之前是确定的。他们都实现相同的接口或者继承相同的抽象类。</p></div><details green><summary> 静态代理相关概念 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622165505422.png" alt="image-20210622165505422"></p> </div> </details></li><li><p>动态代理</p><div class="tip faa-horizontal animated"><p><span class='p red h4'>动态代理</span>:代理类在程序运行时创建的代理方式。</p></div><details green><summary> 动态代理相关概念 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622165336334.png" alt="image-20210622165336334"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622170048070.png" alt="image-20210622170048070"></p> </div> </details></li></ul></li><li><p>不考代码,但要知道动态代理实现的过程和概念</p></li><li><p>A O P的概念,要自己总结一个完整概念,为啥要有A O P(减小程序耦合度)</p><div class="tip faa-horizontal animated"><p><span class='p red h4'>AOP</span>:通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。<br>AOP是OOP的延续,是Spring框架中的一个重要内容<br>利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,<br>提高程序的可重用性,同时提高了开发的效率。</p></div><details green><summary> AOP概念归纳 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622163703688.png" alt="image-20210622163703688"></p><blockquote><ul><li><p>通知(Advice)</p><p>在切面的某个特定的连接点上执行的动作</p></li><li><p>连接点(JoinPoint)</p><p>程序执行过程中的某个特定的点</p></li><li><p>切入点(Pointcut)</p><p>匹配连接点的断言,是连接点位置的集合,指明触发通知(Advice)的条件, 在AOP中通知和一个切入点表达式关联</p></li><li><p>切面(Aspect)</p><p>一个关注点的模块化,这个关注点可能会横切多个对象。point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系。</p></li><li><p>引入(introduction)</p><p>在不修改类代码的前提下,为类添加新的方法和属性</p></li><li><p>目标(target)</p><p>被一个或者多个切面所通知的对象</p></li><li><p>代理(proxy)</p><p>一个类被AOP织入增强后,就产生一个结果代理类</p></li><li><p>织入(weaving)</p><p>把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象,分为:编译时织入、类加载时织入、执行时织入</p></li></ul></blockquote><blockquote><p>AOP作用</p><ol><li>降低模块之间耦合度</li><li>使系统容易扩展</li><li>更好的代码复用</li></ol></blockquote> </div> </details></li><li><p>A O P的应用场景(日志、安全等)</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622163316174.png" alt="image-20210622163316174"></p></li><li><div class="tag link"><a class="link-card" title="详解代理模式" href="https://www.cnblogs.com/daniels/p/8242592.html"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">详解代理模式</p><p class="url">https://www.cnblogs.com/daniels/p/8242592.html</p></div></a></div></li></ul></li><li><p>R P C</p><ul><li><p>概念</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162721348.png" alt="image-20210622162721348"></p></li><li><p>常见实现方案有哪些</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162743906.png" alt="image-20210622162743906"></p></li><li><p>框架的基本原理(会画那张图)</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162823480.png" alt="image-20210622162823480"></p><details green><summary> RPC调用流程(稍微了解即可) </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162922850.png" alt="image-20210622162922850"></p> </div> </details></li></ul></li><li><p>R M I(一种基于JAVA的特殊RPC)</p><div class="tip faa-horizontal animated"><p>知道概念就行,不考代码</p></div><ul><li><p>Java在JDK1.1中实现,增强了Java开发分布式应用的能力</p></li><li><p>RPC的Java jdk版本</p></li><li><details green><summary> RMI原理 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162336512.png" alt="image-20210622162336512"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162346050.png" alt="image-20210622162346050"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img//%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162357160.png" alt="image-20210622162357160"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162426627.png" alt="image-20210622162426627"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622162437141.png" alt="image-20210622162437141"></p> </div> </details></li><li><p>优点:简单</p></li><li><p>缺点</p><ul><li>只基于java</li><li>注册中心</li><li>效率和性能</li><li>安全性</li><li>灵活性和扩展性</li></ul></li></ul></li></ul><h2 id="3-网络I-O"><a href="#3-网络I-O" class="headerlink" title="3. 网络I/O"></a>3. 网络I/O</h2><ul><li><p>基本概念: 阻塞、非阻塞、异步、同步…</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622161927128.png" alt="image-20210622161927128"></p></li><li><p>网络I/O常见的通信模型</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210617083724144.png" alt="image-20210617083724144"></p></li><li><p>Netty应用场景</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210618214012163.png" alt="image-20210618214012163"></p></li><li><p>现有R P C的解决方案(技术选型)</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img//%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210617083950144.png" alt="image-20210617083950144"></p></li></ul><h2 id="4-消息中间件M-Q"><a href="#4-消息中间件M-Q" class="headerlink" title="4. 消息中间件M Q"></a>4. 消息中间件M Q</h2><ul><li><p>M Q能干啥</p><ol><li>业务异步解耦</li><li>解耦微服务</li><li>流量削峰填谷</li><li>消息分发</li><li>分布式事务的数据一致性</li></ol><div class="tag link"><a class="link-card" title="参考" href="https://blog.csdn.net/hzj_java/article/details/115422555"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img//favicon.png"/></div><div class="right"><p class="text">参考</p><p class="url">https://blog.csdn.net/hzj_java/article/details/115422555</p></div></a></div></li><li><p>设计题,设计网络架构来解决应用场景(可用M Q,用具体产品,如Active M Q或Rabbit M Q)</p><div class="tag link"><a class="link-card" title="消息队列案例分析1" href="https://blog.csdn.net/qq_34233510/article/details/88343397"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">消息队列案例分析1</p><p class="url">https://blog.csdn.net/qq_34233510/article/details/88343397</p></div></a></div><div class="tag link"><a class="link-card" title="消息队列案例分析2" href="https://blog.csdn.net/seeingme/article/details/84038356"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">消息队列案例分析2</p><p class="url">https://blog.csdn.net/seeingme/article/details/84038356</p></div></a></div></li><li><p>能画这个设计方案的架构图</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210617084716784.png" alt="image-20210617084716784"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-1552936-20201024112604341-962091331.png" alt="img"></p></li><li><p>M Q的概念</p><div class="tip faa-horizontal animated"><p><span class='p red h4'>MQ(Message Queue)消息队列</span>:是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。</p></div><details green><summary> 查看MQ概念 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160543508.png" alt="image-20210622160543508"></p><p>下面的Where很重要,是案例分析题选用MQ的保证</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160557470.png" alt="image-20210622160557470"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160639296.png" alt="image-20210622160639296"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160654755.png" alt="image-20210622160654755"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160718425.png" alt="image-20210622160718425"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160726482.png" alt="image-20210622160726482"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160759935.png" alt="image-20210622160759935"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160827053.png" alt="image-20210622160827053"></p> </div> </details></li></ul><h2 id="5-分布式存储"><a href="#5-分布式存储" class="headerlink" title="5. 分布式存储"></a>5. 分布式存储</h2><ul><li><p>结构化、半结构化、非结构化</p><ul><li>结构化: Oracle、MySql、Sql Server、DB2</li><li>半结构化: NoSQL数据库</li><li>非结构化: GFS、HDFS</li></ul></li><li><p>关系模型不考</p></li><li><p>主要考核</p><ul><li>非结构化数据——分布式文件系统Ha d o o p</li><li>半结构化数据——N O S Q L</li></ul></li><li><p>案例分析,给一个业务场景,用服务器的拆分、消息队列、缓存(用尽可能多的方案),不会细到拆表</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210617085320731.png" alt="image-20210617085320731"></p></li><li><p>NO S Q L</p><ul><li><p>三大理论基石</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB-image-20210617085431930.png" alt="image-20210617085431930"></p><details green><summary> 对于Base的概念了解即可 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622160014743.png" alt="image-20210622160014743"></p> </div> </details></li><li><p>C A P的概念</p><details green><summary> 主要能知道C、A、P分别是啥即可 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB-image-20210617085505592.png" alt="image-20210617085505592"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622155646490.png" alt="image-20210622155646490"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622155734725.png" alt="image-20210622155734725"></p> </div> </details></li><li><p>NO S Q L四大类型</p><ul><li><p>文档数据库</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622155152430.png" alt="image-20210622155152430"></p></li><li><p>图数据库</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622155203539.png" alt="image-20210622155203539"></p></li><li><p>键值数据库</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622155215401.png" alt="image-20210622155215401"></p></li><li><p>列族数据库</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622155225671.png" alt="image-20210622155225671"></p></li></ul></li><li><p>主要考核redis</p><ul><li><p>REDIS架构图</p><details green><summary> 与传统架构对比 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622154755269.png" alt="image-20210622154755269"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB-image-20210622154806008.png" alt="image-20210622154806008"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622154829863.png" alt="image-20210622154829863"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622154928358.png" alt="image-20210622154928358"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622154957022.png" alt="image-20210622154957022"></p> </div> </details></li><li><p>给关系模型的表,让你转换成redis存储(案例分析题10分)</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622153039335.png" alt="image-20210622153039335"></p><div class="tag link"><a class="link-card" title="redis命令行大全" href="https://www.runoob.com/redis/redis-tutorial.html"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">redis命令行大全</p><p class="url">https://www.runoob.com/redis/redis-tutorial.html</p></div></a></div></li></ul></li></ul></li></ul><h2 id="6-分布式架构"><a href="#6-分布式架构" class="headerlink" title="6. 分布式架构"></a>6. 分布式架构</h2><ul><li><p>SOA和微服务概念</p><ul><li><p>SOA</p><details green><summary> SOA一系列概念 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152216787.png" alt="image-20210622152216787"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152251012.png" alt="image-20210622152251012"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152301643.png" alt="image-20210622152301643"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152311097.png" alt="image-20210622152311097"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152319864.png" alt="image-20210622152319864"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152419760.png" alt="image-20210622152419760"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152428832.png" alt="image-20210622152428832"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152440436.png" alt="image-20210622152440436"></p><p>SOA实践技术: WebServices</p> </div> </details></li><li><p>微服务</p><div class="tip faa-horizontal animated"><p>通常而言,微服务架构是一种架构模式或者说是一种架构风格。<br>它提倡将单一应用程序划分成一组小的服务,每个服务运行独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。<br>服务之间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API) 。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。</p></div><details green><summary> 微服务一系列概念 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152843099.png" alt="image-20210622152843099"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152852742.png" alt="image-20210622152852742"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152942050.png" alt="image-20210622152942050"></p> </div> </details></li><li><p>微服务与SOA对比</p><p><img src="https://unpkg.zhimg.com/[email protected]/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152929271.png" alt="image-20210622152929271"></p></li></ul></li></ul><h2 id="7-大数据"><a href="#7-大数据" class="headerlink" title="7. 大数据"></a>7. 大数据</h2><ul><li><p>基本概念以及hadoop的使用</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622152031761.png" alt="image-20210622152031761"></p></li><li><p>HDFS架构</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210617090134059.png" alt="image-20210617090134059"></p><details green><summary> 几个Node分别干嘛 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622151726302.png" alt="image-20210622151726302"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622151803695.png" alt="image-20210622151803695"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622151815860.png" alt="image-20210622151815860"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622151857927.png" alt="image-20210622151857927"></p><p>总结:</p><p><img src="https://unpkg.zhimg.com/[email protected]/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622151940442.png" alt="image-20210622151940442"></p> </div> </details></li><li><p>hdfs基本命令(案例题,类似于实验1)</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210617090220829.png" alt="image-20210617090220829"></p></li><li><p>MapReduce</p><ul><li><p>会写代码(WordCount)</p><ul><li>参考下方列出的实验2代码</li></ul></li><li><p>Shuffling过程</p><details green open><summary> shuffling过程图 </summary> <div class='content'> <p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622150932945.png" alt="image-20210622150932945"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622151014089.png" alt="image-20210622151014089"></p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210622151031891.png" alt="image-20210622151031891"></p> </div> </details><div class="tag link"><a class="link-card" title="仅供参考的shuffling详解" href="https://blog.csdn.net/u014374284/article/details/49205885"><div class="left"><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/favicon.png"/></div><div class="right"><p class="text">仅供参考的shuffling详解</p><p class="url">https://blog.csdn.net/u014374284/article/details/49205885</p></div></a></div></li><li><p>会画图(不一定是WordCount,区别可能只是在Reducing),了解每一过程做了什么</p><p><img src="https://cdn.jsdelivr.net/gh/Tamiflu233/AssetsRepo/img/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0-image-20210617090634299.png" alt="image-20210617090634299"></p></li><li><p>会写Mapper函数和Reducer函数(类似实验2)</p><details green><summary> 实验二代码 </summary> <div class='content'> <p>MyMapper</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> org.apache.hadoop.io.IntWritable;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.io.Text;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.mapreduce.Mapper;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyMapper</span> <span class="keyword">extends</span></span></span><br><span class="line"><span class="class"> <span class="title">Mapper</span><<span class="title">Object</span>, <span class="title">Text</span>,<span class="title">Text</span>, <span class="title">IntWritable</span>> </span>{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> IntWritable one = <span class="keyword">new</span> IntWritable(<span class="number">1</span>);</span><br><span class="line"> <span class="keyword">private</span> Text word = <span class="keyword">new</span> Text();</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">map</span><span class="params">(Object key, Text value, Context context)</span> <span class="keyword">throws</span> IOException,InterruptedException</span>{</span><br><span class="line"> StringTokenizer itr = <span class="keyword">new</span> StringTokenizer(value.toString());</span><br><span class="line"> <span class="keyword">while</span> (itr.hasMoreTokens())</span><br><span class="line"> {</span><br><span class="line"> word.set(itr.nextToken());</span><br><span class="line"> context.write(word,one);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>MyReducer</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> org.apache.hadoop.io.IntWritable;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.io.Text;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.mapreduce.Mapper;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyReducer</span> <span class="keyword">extends</span> <span class="title">Reducer</span><<span class="title">Text</span>,<span class="title">IntWritable</span>,<span class="title">Text</span>,<span class="title">IntWritable</span>> </span>{</span><br><span class="line"> <span class="keyword">private</span> IntWritable result = <span class="keyword">new</span> IntWritable();</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">reduce</span><span class="params">(Text key, Iterable<IntWritable> values, Context context)</span> <span class="keyword">throws</span> IOException,InterruptedException</span>{</span><br><span class="line"> <span class="keyword">int</span> sum = <span class="number">0</span>;</span><br><span class="line"> String sex = key.toString();</span><br><span class="line"> <span class="keyword">if</span>(<span class="string">"Female"</span>.equals(sex) || <span class="string">"Male"</span>.equals(sex)){</span><br><span class="line"> <span class="keyword">for</span> (IntWritable val : values)</span><br><span class="line"> {</span><br><span class="line"> sum += val.get();</span><br><span class="line"> }</span><br><span class="line"> result.set(sum);</span><br><span class="line"> context.write(key,result);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>WordCount</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> org.apache.hadoop.conf.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.fs.Path;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.io.IntWritable;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.io.Text;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.mapreduce.Job;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.mapreduce.lib.input.FileInputFormat;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;</span><br><span class="line"><span class="keyword">import</span> org.apache.hadoop.util.GenericOptionsParser;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">WordCount</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException, ClassNotFoundException,</span></span><br><span class="line"><span class="function"> InterruptedException </span>{</span><br><span class="line"> Configuration conf = <span class="keyword">new</span> Configuration(); <span class="comment">//程序运行时参数</span></span><br><span class="line"> String[] otherArgs = <span class="keyword">new</span> GenericOptionsParser(conf,args).getRemainingArgs();<span class="comment">//获取命令行输入参数</span></span><br><span class="line"> <span class="keyword">if</span> (otherArgs.length != <span class="number">2</span>)</span><br><span class="line"> { System.err.println(<span class="string">"Usage: wordcount <in> <out>"</span>);</span><br><span class="line"> System.exit(<span class="number">2</span>);</span><br><span class="line"> }</span><br><span class="line"> Job job =Job.getInstance(conf,<span class="string">"word count"</span>); <span class="comment">//设置环境参数</span></span><br><span class="line"></span><br><span class="line"> job.setJarByClass(WordCount.class); <span class="comment">//设置整个程序的类名</span></span><br><span class="line"></span><br><span class="line"> job.setMapperClass(MyMapper.class); <span class="comment">//添加MyMapper类</span></span><br><span class="line"></span><br><span class="line"> job.setReducerClass(MyReducer.class); <span class="comment">//添加MyReducer类</span></span><br><span class="line"></span><br><span class="line"> job.setOutputKeyClass(Text.class); <span class="comment">//设置输出类型</span></span><br><span class="line"></span><br><span class="line"> job.setOutputValueClass(IntWritable.class); <span class="comment">//设置输出类型</span></span><br><span class="line"><span class="comment">// job.setCombinerClass(IntSumReducer.class);//开启combine</span></span><br><span class="line"> FileInputFormat.addInputPath(job,<span class="keyword">new</span> Path(otherArgs[<span class="number">0</span>])); <span class="comment">//设置输入文件</span></span><br><span class="line"> FileOutputFormat.setOutputPath(job,<span class="keyword">new</span> Path(otherArgs[<span class="number">1</span>])); <span class="comment">//设置输出文件</span></span><br><span class="line"> System.exit(job.waitForCompletion(<span class="keyword">true</span>)?<span class="number">0</span>:<span class="number">1</span>);<span class="comment">//提交任务到hadoop</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>pom.xml</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?xml version="1.0" encoding="UTF-8"?></span></span><br><span class="line"><span class="tag"><<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/POM/4.0.0"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">modelVersion</span>></span>4.0.0<span class="tag"></<span class="name">modelVersion</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.example<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>HadoopTest<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0-SNAPSHOT<span class="tag"><<span class="name">ersion</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="comment"><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.hadoop<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>hadoop-mapreduce-client-core<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.0<span class="tag"><<span class="name">ersion</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="comment"><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.hadoop<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>hadoop-core<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.2.1<span class="tag"><<span class="name">ersion</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">dependencies</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">build</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugins</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.maven.plugins<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>maven-compiler-plugin<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span>1.8<span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span>></span>1.8<span class="tag"></<span class="name">target</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ugin</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.maven.plugins<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>maven-jar-plugin<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">archive</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">manifest</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">addClasspath</span>></span>true<span class="tag"></<span class="name">addClasspath</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">useUniqueVersions</span>></span>false<span class="tag"></<span class="name">useUniqueVersions</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">classpathPrefix</span>></span>lib/<span class="tag"></<span class="name">classpathPrefix</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mainClass</span>></span>com.wl.WordCount<span class="tag"></<span class="name">mainClass</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">manifest</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">archive</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugins</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">build</span>></span></span><br><span class="line"><span class="tag"></<span class="name">project</span>></span></span><br></pre></td></tr></table></figure> </div> </details></li></ul></li></ul>]]></content>
<categories>
<category> 🎉分布式计算 </category>
</categories>
<tags>
<tag> 🌹期末 </tag>
<tag> 🎁复习提纲 </tag>
<tag> 💖分布式计算 </tag>
</tags>
</entry>
</search>