-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
930 lines (606 loc) · 82.8 KB
/
index.html
File metadata and controls
930 lines (606 loc) · 82.8 KB
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<link rel="dns-prefetch" href="http://yoursite.com">
<title>凹凸曼的博客</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description" content="Software is like sex,it's better when it's free">
<meta property="og:type" content="website">
<meta property="og:title" content="凹凸曼的博客">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="凹凸曼的博客">
<meta property="og:description" content="Software is like sex,it's better when it's free">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="凹凸曼的博客">
<meta name="twitter:description" content="Software is like sex,it's better when it's free">
<link rel="alternative" href="/atom.xml" title="凹凸曼的博客" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<link rel="stylesheet" type="text/css" href="/./main.2d7529.css">
<style type="text/css">
#container.show {
background: linear-gradient(200deg,#a0cfe4,#e8c37e);
}
</style>
</head>
<body>
<div id="container" q-class="show:isCtnShow">
<canvas id="anm-canvas" class="anm-canvas"></canvas>
<div class="left-col" q-class="show:isShow">
<div class="overlay" style="background: #4d4d4d"></div>
<div class="intrude-less">
<header id="header" class="inner">
<a href="/" class="profilepic">
<img src="http://upload.jianshu.io/users/upload_avatars/3004539/b61677c5e69a.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240" class="js-avatar">
</a>
<hgroup>
<h1 class="header-author"><a href="/">凹凸曼</a></h1>
</hgroup>
<p class="header-subtitle">Software is like sex,it's better when it's free</p>
<nav class="header-menu">
<ul>
<li><a href="/">主页</a></li>
</ul>
</nav>
<nav class="header-smart-menu">
<a q-on="click: openSlider(e, 'innerArchive')" href="javascript:void(0)">所有文章</a>
<a q-on="click: openSlider(e, 'friends')" href="javascript:void(0)">友链</a>
<a q-on="click: openSlider(e, 'aboutme')" href="javascript:void(0)">关于我</a>
</nav>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="#" title="github"><i class="icon-github"></i></a>
<a class="zhihu" target="_blank" href="#" title="zhihu"><i class="icon-zhihu"></i></a>
<a class="weixin" target="_blank" href="#" title="weixin"><i class="icon-weixin"></i></a>
<a class="jianshu" target="_blank" href="#" title="jianshu"><i class="icon-jianshu"></i></a>
<a class="facebook" target="_blank" href="#" title="facebook"><i class="icon-facebook"></i></a>
</div>
</nav>
</header>
</div>
</div>
<div class="mid-col" q-class="show:isShow,hide:isShow|isFalse">
<nav id="mobile-nav">
<div class="overlay js-overlay" style="background: #4d4d4d"></div>
<div class="btnctn js-mobile-btnctn">
<div class="slider-trigger list" q-on="click: openSlider(e)"><i class="icon icon-sort"></i></div>
</div>
<div class="intrude-less">
<header id="header" class="inner">
<div class="profilepic">
<img src="http://upload.jianshu.io/users/upload_avatars/3004539/b61677c5e69a.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240" class="js-avatar">
</div>
<hgroup>
<h1 class="header-author js-header-author">凹凸曼</h1>
</hgroup>
<p class="header-subtitle"><i class="icon icon-quo-left"></i>Software is like sex,it's better when it's free<i class="icon icon-quo-right"></i></p>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="#" title="github"><i class="icon-github"></i></a>
<a class="zhihu" target="_blank" href="#" title="zhihu"><i class="icon-zhihu"></i></a>
<a class="weixin" target="_blank" href="#" title="weixin"><i class="icon-weixin"></i></a>
<a class="jianshu" target="_blank" href="#" title="jianshu"><i class="icon-jianshu"></i></a>
<a class="facebook" target="_blank" href="#" title="facebook"><i class="icon-facebook"></i></a>
</div>
</nav>
<nav class="header-menu js-header-menu">
<ul style="width: 50%">
<li style="width: 100%"><a href="/">主页</a></li>
</ul>
</nav>
</header>
</div>
<div class="mobile-mask" style="display:none" q-show="isShow"></div>
</nav>
<div id="wrapper" class="body-wrap">
<div class="menu-l">
<div class="canvas-wrap">
<canvas data-colors="#eaeaea" data-sectionHeight="100" data-contentId="js-content" id="myCanvas1" class="anm-canvas"></canvas>
</div>
<div id="js-content" class="content-ll">
<article id="post-Android多线程下载" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/02/12/Android多线程下载/">Android多线程下载</a>
</h1>
<a href="/2017/02/12/Android多线程下载/" class="archive-article-date">
<time datetime="2017-02-12T03:47:50.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2017-02-12</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>万事都有两面性,多线程下载也是,那么多线程下载的优点是什么呢?归根结底还是多线程的优点,这里我们暂且不去讨论它的利弊,只是讲解一下思想和实现方案。</p>
<h2 id="实现分析"><a href="#实现分析" class="headerlink" title="实现分析"></a>实现分析</h2><p>我们用五个why的思想来分析一下这个问题:</p>
<ol>
<li>怎么实现多线程下载?<br>将下载逻辑在多个线程中同时运行。</li>
<li>怎么让每个线程下载对应的文件?<br>将文件拆分成线程数对应的分数,进行分配。</li>
<li>怎么拆分文件?<br>获取文件的长度,再按照线程数进行按比例分配。</li>
<li>怎么获取文件长度?<br>利用HttpURLConnection的方法来获取内容长度</li>
<li>下载完成之后怎么办?<br>各个线程都下载完成之后利用RandomAccessFile进行文件合并</li>
</ol>
<p>好了,分析到这我们感觉已经可以实现了,我们再重新梳理一下逻辑,大概是,设定线程的数量,按照线程数量来分割要下载的文件,启动多个线程进行下载,最后合成一个文件。OK,撸起袖子就是干!</p>
<h2 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h2><p>1、设置线程数,我这边是默认指定了三个,大家也可以通过服务器配置啊,或者某些算法来计算需要的线程数,根据实际情况来定。<br>2、获取文件长度:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">URL url = <span class="keyword">new</span> URL(file.url);</div><div class="line">HttpURLConnection con = (HttpURLConnection)</div><div class="line">url.openConnection();</div><div class="line">con.setRequestMethod(<span class="string">"GET"</span>);</div><div class="line">con.setConnectTimeout(<span class="number">5000</span>);</div><div class="line"><span class="keyword">if</span>(con.getResponseCode() == HttpURLConnection.HTTP_OK) {</div><div class="line"> <span class="keyword">int</span> len = con.getContentLength(); <span class="comment">//文件的总长度</span></div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>这样我们就获取到了文件的长度,然后就可以分割下载了,当然之前我们要初始化一些路径啊,RandomAccessFile什么的,大家可以下载源码查看。<br>3、分割文件内容:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">List<ThreadInfo> threadInfoList = <span class="keyword">new</span> LinkedList<ThreadInfo>(); <span class="comment">//建立线程信息列表</span></div><div class="line"> <span class="keyword">int</span> block = mDownloadInfo.lenght/mThreadCount; <span class="comment">//将下载文件分段</span></div><div class="line"> <span class="keyword">if</span>(block > <span class="number">0</span>) {</div><div class="line"> <span class="comment">//start 根据线程数量分别建立线程信息</span></div><div class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>;i < mThreadCount;i++) {</div><div class="line"> ThreadInfo info = <span class="keyword">new</span> ThreadInfo(i,mDownloadInfo.url,i*block,(i+<span class="number">1</span>)*block-<span class="number">1</span>,<span class="number">0</span>);</div><div class="line"> <span class="keyword">if</span>(i == mThreadCount -<span class="number">1</span>) {</div><div class="line"> info.end = mDownloadInfo.lenght; <span class="comment">//分段最后一个,结束位置到文件总长度末尾</span></div><div class="line"> }</div><div class="line"> threadInfoList.add(info); <span class="comment">//加入列表</span></div><div class="line"> }</div><div class="line"> <span class="comment">//end 根据线程数量分别建立线程信息</span></div></pre></td></tr></table></figure></p>
<p>4、启动下载线程:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//start 启动下载线程</span></div><div class="line"><span class="keyword">for</span>(ThreadInfo info : threadInfoList) {</div><div class="line"> DownloadThread thread = <span class="keyword">new</span> DownloadThread(info,mDownloadInfo,mTotalFinished);</div><div class="line"> <span class="keyword">if</span>(!mThreadPool.isShutdown()) {</div><div class="line"> mThreadPool.execute(thread);</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>5、下载的逻辑和RandomAccessFile最后生成一个完整的文件:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>{</div><div class="line"> URL url = <span class="keyword">null</span>;</div><div class="line"> HttpURLConnection con = <span class="keyword">null</span>; <span class="comment">//http链接</span></div><div class="line"> RandomAccessFile accessFile = <span class="keyword">null</span>; <span class="comment">//下载文件</span></div><div class="line"> InputStream inputStream = <span class="keyword">null</span>; <span class="comment">//输入流</span></div><div class="line"> <span class="keyword">try</span> {</div><div class="line"></div><div class="line"> <span class="keyword">int</span> start = threadInfo.start+threadInfo.finished; <span class="comment">//读取文件的位置</span></div><div class="line"> <span class="comment">//start 初始化下载链接</span></div><div class="line"> url = <span class="keyword">new</span> URL(threadInfo.url);</div><div class="line"> con = (HttpURLConnection) url.openConnection();</div><div class="line"> con.setRequestMethod(<span class="string">"GET"</span>);</div><div class="line"> con.setConnectTimeout(<span class="number">5000</span>);</div><div class="line"> con.setRequestProperty(<span class="string">"Range"</span>, <span class="string">"bytes="</span> + start + <span class="string">"-"</span> + threadInfo.end); <span class="comment">//设置读取文件的位置,和结束位置</span></div><div class="line"> <span class="comment">//end 初始化下载链接</span></div><div class="line"> <span class="comment">//start 初始化下载到本地的文件</span></div><div class="line"> accessFile = <span class="keyword">new</span> RandomAccessFile(<span class="keyword">new</span> File(downloadInfo.filePath, downloadInfo.fileName),<span class="string">"rwd"</span>);</div><div class="line"> accessFile.seek(start); <span class="comment">//设置开始写入的位置</span></div><div class="line"> <span class="comment">//end 初始化下载到本地的文件</span></div><div class="line"></div><div class="line"> <span class="keyword">int</span> responseCode = con.getResponseCode();</div><div class="line"> <span class="keyword">if</span>((con.getResponseCode() == HttpURLConnection.HTTP_PARTIAL) ||</div><div class="line"> (con.getResponseCode() == HttpURLConnection.HTTP_OK) ) {</div><div class="line"> inputStream = con.getInputStream();</div><div class="line"> <span class="keyword">int</span> finished = threadInfo.finished; <span class="comment">//已经下载的长度</span></div><div class="line"> <span class="keyword">int</span> readLen = -<span class="number">1</span>; <span class="comment">//读取的长度</span></div><div class="line"> <span class="keyword">byte</span>[] buffer = <span class="keyword">new</span> <span class="keyword">byte</span>[<span class="number">1024</span>*<span class="number">4</span>];</div><div class="line"> <span class="keyword">long</span> time = System.currentTimeMillis();</div><div class="line"></div><div class="line"> <span class="comment">//start 读取输入流写入文件</span></div><div class="line"> <span class="keyword">while</span>((readLen = inputStream.read(buffer))!=-<span class="number">1</span>) {</div><div class="line"> accessFile.write(buffer, <span class="number">0</span>, readLen);</div><div class="line"> );</div><div class="line"> }</div><div class="line"> } <span class="keyword">catch</span> (MalformedURLException e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> } <span class="keyword">catch</span> (ProtocolException e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> } <span class="keyword">catch</span> (IOException e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }<span class="keyword">finally</span> {</div><div class="line"></div><div class="line"> <span class="keyword">try</span> {</div><div class="line"> <span class="keyword">if</span>(inputStream!=<span class="keyword">null</span>){</div><div class="line"> inputStream.close();</div><div class="line"> }</div><div class="line"> <span class="keyword">if</span>(accessFile!=<span class="keyword">null</span>) {</div><div class="line"> accessFile.close();</div><div class="line"> }</div><div class="line"> <span class="keyword">if</span>(<span class="keyword">null</span>!=con) {</div><div class="line"> con.disconnect();</div><div class="line"> }</div><div class="line"></div><div class="line"> } <span class="keyword">catch</span> (IOException e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"> <span class="keyword">super</span>.run();</div><div class="line">}</div></pre></td></tr></table></figure></p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>好了,主要下载逻辑就是这样,大家想看完整代码的可以点击下面的链接,希望大家可以喜欢,谢谢!<br><a href="https://github.com/OnlyTerminator/MultithreadingDownload" target="_blank" rel="external">源码下载</a></p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">多线程</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/2017/02/12/Android多线程下载/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-利用Hexo和Github搭建自己的简单博客" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/02/07/利用Hexo和Github搭建自己的简单博客/">利用Hexo和Github搭建自己的简单博客</a>
</h1>
<a href="/2017/02/07/利用Hexo和Github搭建自己的简单博客/" class="archive-article-date">
<time datetime="2017-02-07T13:27:24.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2017-02-07</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="申请Github账号"><a href="#申请Github账号" class="headerlink" title="申请Github账号"></a>申请Github账号</h2><p>这个大家可以自行申请,不会的也可以百度一下,这里也贴上一个百度经验的链接<a href="http://jingyan.baidu.com/article/455a9950abe0ada167277864.html" target="_blank" rel="external">Github的账号申请方法</a></p>
<h2 id="Github-Pages的使用"><a href="#Github-Pages的使用" class="headerlink" title="Github Pages的使用"></a>Github Pages的使用</h2><p>有了账号以后,首先点击新建仓库,如图:<br><img src="http://upload-images.jianshu.io/upload_images/3004539-f37975c9bb03ad02?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="创建项目"></p>
<p>然后到达仓库信息填写界面,如图:<br><img src="http://upload-images.jianshu.io/upload_images/3004539-9f7dda1436aff225?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="填写用户名"><br><strong>这里只要注意一个地方,就是仓库的名称,必须是:你的用户名.github.io<br>因为我的已经申请了,没找到截图,所以这个是找的网上的鸿洋老师的截图,他的用户名是hongyangAndroid,所以他的用户名是hongyangAndroid.github.io。</strong></p>
<h2 id="安装Git客户端"><a href="#安装Git客户端" class="headerlink" title="安装Git客户端"></a>安装Git客户端</h2><p><a href="https://git-for-windows.github.io/" target="_blank" rel="external">Git官方下载地址</a><br>大家下载直接安装就行,一直下一步就可以,没什么特殊的,安装完成时候配置一下环境变量。<br><strong>搭建安装完成之后记得打开Git Base Here 配置用户名和邮箱,有些使用SSH我这边没有使用</strong></p>
<pre><code>git config --global user.name [username]
git config --global user.email [email]
</code></pre><h2 id="安装Node(必须)"><a href="#安装Node(必须)" class="headerlink" title="安装Node(必须)"></a>安装Node(必须)</h2><p>作用:用来生成静态页面的<br>到Node.js<a href="https://nodejs.org/" target="_blank" rel="external">官网</a>下载相应平台的最新版本,一路安装即可。</p>
<h2 id="正式安装Hexo"><a href="#正式安装Hexo" class="headerlink" title="正式安装Hexo"></a>正式安装Hexo</h2><p>Node和Git都安装好后,首先创建一个文件夹,如blog,用户存放hexo的配置文件,然后进入blog里安装Hexo。</p>
<h4 id="执行如下命令安装Hexo:"><a href="#执行如下命令安装Hexo:" class="headerlink" title="执行如下命令安装Hexo:"></a>执行如下命令安装Hexo:</h4><pre><code>npm install -g hexo
</code></pre><h4 id="初始化然后,执行init命令初始化hexo-命令:"><a href="#初始化然后,执行init命令初始化hexo-命令:" class="headerlink" title="初始化然后,执行init命令初始化hexo,命令:"></a>初始化然后,执行init命令初始化hexo,命令:</h4><pre><code>hexo init
</code></pre><p>好啦,至此,全部安装工作已经完成!blog就是你的博客根目录,所有的操作都在里面进行。</p>
<h4 id="生成静态页面"><a href="#生成静态页面" class="headerlink" title="生成静态页面"></a>生成静态页面</h4><pre><code>hexo generate(hexo g也可以)
</code></pre><h4 id="本地启动"><a href="#本地启动" class="headerlink" title="本地启动"></a>本地启动</h4><p>启动本地服务,进行文章预览调试,命令:</p>
<pre><code>hexo server
</code></pre><p>浏览器输入<a href="http://localhost:4000" target="_blank" rel="external">http://localhost:4000</a></p>
<p>我不知道你们能不能,反正我不能,一直打不开,不管他,我们直接配置到Github上。</p>
<h4 id="Hexo和Github相结合"><a href="#Hexo和Github相结合" class="headerlink" title="Hexo和Github相结合"></a>Hexo和Github相结合</h4><p>在我们刚刚建立的blog的目录下面<strong>_config.yml</strong>的文件,打开之后,最下面配置Github</p>
<pre><code>deploy:
type: git
repo: https://github.com/OnlyTerminator/OnlyTerminator.github.io
branch: master
</code></pre><p>然后执行命令:</p>
<pre><code>npm install hexo-deployer-git --save
</code></pre><p>最后啦,执行配置命令:</p>
<pre><code>hexo deploy
</code></pre><p><strong>这一块可能要输入用户名和密码</strong><br>完成之后再浏览器中输入<a href="https://onlyterminator.github.io/" target="_blank" rel="external">https://onlyterminator.github.io/</a>就行了,我的github的账户叫onlyterminator,你们把这个改成你自己的github账户名就行了。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/3004539-d03be94ffe5ac04d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="大致看一下效果"></p>
<h4 id="后期更新博客"><a href="#后期更新博客" class="headerlink" title="后期更新博客"></a>后期更新博客</h4><p>后期我们想要添加博客。只要在blog目录下面的source_posts下面添加.md文件就行,我们也可以通过命令来新建,位置也在source_posts下面</p>
<pre><code>hexo new"postName" #新建文章
</code></pre><p>然后执行下面的命令部署到Github上:</p>
<pre><code>hexo clean
hexo generate
hexo deploy
</code></pre>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">util</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/2017/02/07/利用Hexo和Github搭建自己的简单博客/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-Android自定义Log库" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/02/06/Android自定义Log库/">Android自定义Log库</a>
</h1>
<a href="/2017/02/06/Android自定义Log库/" class="archive-article-date">
<time datetime="2017-02-06T12:51:03.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2017-02-06</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我们在开发的时候肯定会打一些Log,特别是在调试代码或者bug的时候,我们都会打一些Log日志来记录,但是当我们发布正式版本的时候,尼玛,要一行一行的去掉,这就尴尬了。<br><img src="http://upload-images.jianshu.io/upload_images/3004539-0dd9009215078968.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="懵逼状态"></p>
<h2 id="励志封装Log库"><a href="#励志封装Log库" class="headerlink" title="励志封装Log库"></a>励志封装Log库</h2><p>本来想使用github上的Logger库的,但是感觉有点烦中,后面看到了鸿洋大师写过一篇关于Log库的文章 <a href="http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650821049&idx=1&sn=a704a3b104692364b17657f71f652263&mpshare=1&scene=1&srcid=0927MbhkNpjnUyG1iyfMV2no#rd" target="_blank" rel="external">Android反观Log库</a>后面我也是根据这个来简单的修改的</p>
<h2 id="自定义内容"><a href="#自定义内容" class="headerlink" title="自定义内容"></a>自定义内容</h2><ol>
<li>增加变量来区分debug模式还是release模式,在release的情况下将所有的Log日志都去掉。</li>
<li>利用StackTraceElement来输出我们的Log的位置,便于我们定位和寻找日志。</li>
</ol>
<h2 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h2><p>我们以i的log来作为例子:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"> * iiiiiiiiiiiiii</div><div class="line"> * <span class="doctag">@param</span> content</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">i</span><span class="params">(String content)</span></span>{</div><div class="line"> i(<span class="keyword">null</span>,content);</div><div class="line"> }</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">i</span><span class="params">(String tag,String content)</span></span>{</div><div class="line"> <span class="keyword">if</span> (!sDebug) <span class="keyword">return</span>;</div><div class="line"> printer.i(getFinalTag(tag),content);</div><div class="line"> }</div></pre></td></tr></table></figure></p>
<p>其中的isDebug是我们的标识位,我们可以把它在初始化的时候来与编译类型绑定起来。<br>其中Printer类是实现了打印Log日志功能的输出类:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">LogPrint</span> <span class="keyword">implements</span> <span class="title">Printer</span></span>{</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">d</span><span class="params">(String message, String str)</span> </span>{</div><div class="line"> <span class="keyword">new</span> DebugLogText(message).setup(str);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">e</span><span class="params">(String message, String str)</span> </span>{</div><div class="line"> <span class="keyword">new</span> ErrorLogText(message).setup(str);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">e</span><span class="params">(String message, String str,Throwable throwable)</span> </span>{</div><div class="line"> <span class="keyword">new</span> ErrorLogText(message).setup(str+throwable.getMessage());</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">w</span><span class="params">(String message, String str)</span> </span>{</div><div class="line"> <span class="keyword">new</span> WarnLogText(message).setup(str);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">i</span><span class="params">(String message, String str)</span> </span>{</div><div class="line"> <span class="keyword">new</span> InfoLogText(message).setup(str);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">v</span><span class="params">(String message, String str)</span> </span>{</div><div class="line"> <span class="keyword">new</span> VerboseLogText(message).setup(str);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">wtf</span><span class="params">(String message, Object... args)</span> </span>{</div><div class="line"></div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">json</span><span class="params">(String message, String json)</span> </span>{</div><div class="line"> <span class="keyword">new</span> InfoLogText(message).setup(json);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">xml</span><span class="params">(String xml)</span> </span>{</div><div class="line"></div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">clear</span><span class="params">()</span> </span>{</div><div class="line"></div><div class="line">}</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>具体的输出类型是由对应的Log类型来产生,我们来看一个类InfoLogText:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">InfoLogText</span> <span class="keyword">extends</span> <span class="title">LogText</span> </span>{</div><div class="line"><span class="function"><span class="keyword">public</span> <span class="title">InfoLogText</span><span class="params">(String tag)</span> </span>{</div><div class="line"> <span class="keyword">super</span>(tag);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">setUpHeader</span><span class="params">()</span> </span>{</div><div class="line"> Log.i(mTag, SINGLE_DIVIDER);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">setUpFooter</span><span class="params">()</span> </span>{</div><div class="line"> Log.i(mTag, DOUBLE_DIVIDER);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">setUpContent</span><span class="params">(String content)</span> </span>{</div><div class="line"> StackTraceElement targetStackTraceElement=getTargetStackTraceElement();</div><div class="line"> Log.i(mTag, <span class="string">"("</span> + targetStackTraceElement.getFileName() + <span class="string">":"</span></div><div class="line"> + targetStackTraceElement.getLineNumber() + <span class="string">")"</span>);</div><div class="line"> Log.i(mTag, content);</div><div class="line">}</div><div class="line">}</div></pre></td></tr></table></figure></p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我们可以看到,它实际调用的是系统的Log的日志方法,当然拼接了,对应的Log日志的类和行数,具体的原理我们可以查看上面提到的鸿洋的文章。<br>好了,我么大家来看一下最后的日志效果</p>
<pre><code>11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: ********************************************
11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: (MainActivity.java:30)
11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: is a test
11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: ════════════════════════════════════════════
</code></pre><p>最后附上源码的下载地址,喜欢的朋友可以下载使用,代码很少,也可以相互交流<a href="https://github.com/OnlyTerminator/CustomLog" target="_blank" rel="external">Android自定义Log库</a></p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">util</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/2017/02/06/Android自定义Log库/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-markdown" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/02/06/markdown/">Markdown语法简单解析</a>
</h1>
<a href="/2017/02/06/markdown/" class="archive-article-date">
<time datetime="2017-02-06T10:05:51.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2017-02-06</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<p><a href="http://zh.wikipedia.org/wiki/Markdown" target="_blank" rel="external">Markdown</a>?是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。看到这里请不要被「标记」、「语言」所迷惑,Markdown 的语法十分简单。常用的标记符号也不超过十个,这种相对于更为复杂的HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多,且一旦熟悉这种语法规则,会有一劳永逸的效果。</p>
<h2 id="使用-Markdown-的优点"><a href="#使用-Markdown-的优点" class="headerlink" title="使用 Markdown 的优点"></a>使用 Markdown 的优点</h2><p>专注你的文字内容而不是排版样式。<br>轻松的导出 HTML、PDF 和本身的 .md 文件。<br>纯文本内容,兼容所有的文本编辑器与字处理软件。<br>可读,直观。适合所有人的写作语言。</p>
<p>好了,我们直接步入正题吧,来讲解一下Markdown常用的集中语法:</p>
<h2 id="1、标题"><a href="#1、标题" class="headerlink" title="1、标题"></a>1、标题</h2><p>标题是每篇文章都需要也是最常用的格式,在 Markdown 中,如果一段文字被定义为标题,只要在这段文字前加?#?号即可。</p>
<pre><code># 一级标题
## 二级标题
### 三级标题
</code></pre><p>以此类推,总共六级标题,建议在井号后加一个空格,这是最标准的 Markdown 语法。</p>
<h2 id="2、列表"><a href="#2、列表" class="headerlink" title="2、列表"></a>2、列表</h2><p>我是一个程序员,所以在平时写一些文章的时候不太用到列表,但是它的语法也很简单,熟悉 HTML 的同学肯定知道有序列表与无序列表的区别。<br>在 Markdown 下,列表的显示只需要在文字前加上?-?或?*<br>?即可变为无序列表,有序列表则直接在文字前加?1.?2. 3. 符号要和文字之间加上一个字符的空格。</p>
<p>无序列表:</p>
<pre><code>* 入门详解
* 我是语法
</code></pre><ul>
<li>入门详解</li>
<li>我是语法</li>
</ul>
<p>有序列表:</p>
<pre><code>1. 测试一下看看
2. 我是有序列表
</code></pre><ol>
<li>测试一下看看</li>
<li>我是有序列表</li>
</ol>
<h2 id="3、引用"><a href="#3、引用" class="headerlink" title="3、引用"></a>3、引用</h2><p>如果你需要引用一小段别处的句子,那么就要用引用的格式。</p>
<pre><code>>例如这样
</code></pre><blockquote>
<p>例如这样</p>
</blockquote>
<p>只需要在文本前加入?>?这种尖括号(大于号)即可</p>
<h2 id="3、图片与链接"><a href="#3、图片与链接" class="headerlink" title="3、图片与链接"></a>3、图片与链接</h2><p>插入链接与插入图片的语法很像,区别在一个?!号,插入链接的方法 [要显示的文字](实际的链接地址)</p>
<pre><code>[百度](http://baidu.com)
</code></pre><p> <a href="http://baidu.com" target="_blank" rel="external">百度</a><br>插入图片的实现方法</p>
<pre><code>
</code></pre><p><img src="http://upload-images.jianshu.io/upload_images/3004539-703d7cc6886ca745.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="百度的一张图片"></p>
<h2 id="4、粗体与斜体"><a href="#4、粗体与斜体" class="headerlink" title="4、粗体与斜体"></a>4、粗体与斜体</h2><p>Markdown 的粗体和斜体也非常简单</p>
<pre><code>用两个*包含一段文本就是粗体的语法,
用一个 * 包含一段文本就是斜体的语法。
</code></pre><p>下面看一个例子:</p>
<pre><code>**这里是粗体**
</code></pre><p><strong>这里是粗体</strong></p>
<pre><code>?*这里是斜体*
</code></pre><p><em>这里是斜体</em></p>
<h2 id="5、表格"><a href="#5、表格" class="headerlink" title="5、表格"></a>5、表格</h2><p>表格是我觉得 Markdown 比较累人的地方,所以我很少用,实在是蛋疼,例子如下:</p>
<pre><code>| Tables | Are | Cool |
| ------------- |:-------------:| -----:|
| col 3 is | right-aligned | $1600 |
| col 2 is | centered | $12 |
| zebra stripes | are neat | $1 |
</code></pre><p>这种语法生成的表格如下:</p>
<table>
<thead>
<tr>
<th>Tables</th>
<th style="text-align:center">Are</th>
<th style="text-align:right">Cool</th>
</tr>
</thead>
<tbody>
<tr>
<td>col 3 is</td>
<td style="text-align:center">right-aligned</td>
<td style="text-align:right">$1600</td>
</tr>
<tr>
<td>col 2 is</td>
<td style="text-align:center">centered</td>
<td style="text-align:right">$12</td>
</tr>
<tr>
<td>zebra stripes</td>
<td style="text-align:center">are neat</td>
<td style="text-align:right">$1</td>
</tr>
</tbody>
</table>
<h2 id="6、代码框"><a href="#6、代码框" class="headerlink" title="6、代码框"></a>6、代码框</h2><p>对于我们这样的程序猿来说,这才是重点,如果你也跟我一样,是程序员,那你就可以用下面的方法来让自己的代码片段优雅的展示在文章里面,用一个`来包含你的代码片段 是键盘上那个 ~ 噢,不是’号,使用?tab?键即可缩进。<br>我们看一个例子:</p>
<pre><code>`public void test(){
System.out.println("hello world!");
}`
</code></pre><p><code>public void test(){
System.out.println("hello world!");
}</code></p>
<h2 id="7、分割线"><a href="#7、分割线" class="headerlink" title="7、分割线"></a>7、分割线</h2><pre><code>分割线的语法只需要另起一行,连续输入三个星号?***即可。
</code></pre><p>老样子,我们还是来举一个栗子:</p>
<pre><code>到这里,我们的语法讲解快结束了
***
有问题大家一起交流啊!
</code></pre><p>到这里,我们的语法讲解快结束了</p>
<hr>
<p>有问题大家一起交流啊!</p>
<p>##8、小结<br>我也只是刚刚接触这种语法,想写一些东西记录一下,也给正在学习的朋友们做一下参考,大家有其他常用的语法可以给我留言,我会及时的补充到文章里面,谢谢大家!</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">util</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/2017/02/06/markdown/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-java反射的简单使用" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/02/06/java反射的简单使用/">java反射的简单使用</a>
</h1>
<a href="/2017/02/06/java反射的简单使用/" class="archive-article-date">
<time datetime="2017-02-06T10:05:50.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2017-02-06</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="百度百科"><a href="#百度百科" class="headerlink" title="百度百科"></a>百度百科</h2><p>先来一些不太实用的解释:JAVA反射机制是在<a href="http://baike.baidu.com/view/627351.htm" target="_blank" rel="external">运行状态</a>中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。</p>
<h2 id="简单使用"><a href="#简单使用" class="headerlink" title="简单使用"></a>简单使用</h2><p>反射,在java中是非常常见和好用的一种方式,<strong>(但是大家需要知道,他的效率是比较低的,所以要慎用)</strong>当然在基于java语言而产生的Android中也是可以使用的,我们可以使用反射来获取一些系统并不开放,但是存在的类,从而调用他的一些方法,下面就简单的写一下,利用java反射来获取类和调用它的方法的实现。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//需要被反射调用的类的路径 </span></div><div class="line">String className = <span class="string">"com.example.test.JavaReflect"</span>;Class reflect = <span class="keyword">null</span>; </div><div class="line"><span class="keyword">try</span> { </div><div class="line"> <span class="comment">//通过路径来获取java类 </span></div><div class="line"> reflect = Class.forName(className); </div><div class="line"> <span class="comment">//实例化对应得类 </span></div><div class="line"> Object javaReflect = reflect.newInstance(); </div><div class="line"> <span class="keyword">if</span>(<span class="keyword">null</span> != javaReflect) { </div><div class="line"> <span class="comment">//反射出该Class类中的stringToUp()方法 stringToUp是方法名,String.class是参数类型 </span></div><div class="line"> Method stringToUp = reflect.getDeclaredMethod(<span class="string">"stringToUp"</span>, String.class); </div><div class="line"> <span class="comment">//取消访问私有方法的合法性检查 </span></div><div class="line"> stringToUp.setAccessible(<span class="keyword">true</span>); </div><div class="line"> <span class="comment">//调用stringToUp()方法,第一个参数表示对应的类,第二个是方法的参数 </span></div><div class="line"> String str = (String) stringToUp.invoke(javaReflect,<span class="string">"java reflect test"</span>); </div><div class="line"> System.out.println(<span class="string">"result:"</span>+str);</div><div class="line"> }</div><div class="line">}<span class="keyword">catch</span> (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>我们来看一下,在stringToUp里面做了什么:</p>
<pre><code>public String stringToUp(String str){
return str.toUpperCase();
}
</code></pre><p>其实就是一个对字符串转换成大写,然返回,好了我们来看一下输出结果</p>
<pre><code>01-02 08:09:11.959 6150-6150/com.zxf.alpha I/System.out: result:JAVA REFLECT TEST
</code></pre><p>简直就是完美。</p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>反射在Android中的应用范围也很多,比如我们项目有多个module的时候,你想在module里面调用主的程序的一个方法你就可以这么干,也可以用反射来调用一些系统为公开的方法,但是效率不太高。</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">java</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/2017/02/06/java反射的简单使用/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-hello-world" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/01/06/hello-world/">Hello World</a>
</h1>
<a href="/2017/01/06/hello-world/" class="archive-article-date">
<time datetime="2017-01-06T10:05:50.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2017-01-06</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="external">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="external">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="external">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo new <span class="string">"My New Post"</span></div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="external">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo server</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="external">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo generate</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="external">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo deploy</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="external">Deployment</a></p>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2017/01/06/hello-world/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
</div>
</div>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info">
<div class="footer-left">
© 2017 凹凸曼
</div>
<div class="footer-right">
<a href="http://hexo.io/" target="_blank">Hexo</a> Theme <a href="https://github.com/litten/hexo-theme-yilia" target="_blank">Yilia</a> by Litten
</div>
</div>
</div>
</footer>
</div>
<script>
var yiliaConfig = {
mathjax: false,
isHome: true,
isPost: false,
isArchive: false,
isTag: false,
isCategory: false,
open_in_new: false,
root: "/",
innerArchive: true,
showTags: true
}
</script>
<script>!function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var e={};return n.m=t,n.c=e,n.p="./",n(0)}([function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,n){var e=/\/|index.html/g;return t.replace(e,"")===n.replace(e,"")}function i(){for(var t=document.querySelectorAll(".js-header-menu li a"),n=window.location.pathname,e=0,r=t.length;e<r;e++){var i=t[e];o(n,i.getAttribute("href"))&&(0,d.default)(i,"active")}}function u(t){for(var n=t.offsetLeft,e=t.offsetParent;null!==e;)n+=e.offsetLeft,e=e.offsetParent;return n}function f(t){for(var n=t.offsetTop,e=t.offsetParent;null!==e;)n+=e.offsetTop,e=e.offsetParent;return n}function c(t,n,e,r,o){var i=u(t),c=f(t)-n;if(c-e<=o){var a=t.$newDom;a||(a=t.cloneNode(!0),(0,h.default)(t,a),t.$newDom=a,a.style.position="fixed",a.style.top=(e||c)+"px",a.style.left=i+"px",a.style.zIndex=r||2,a.style.width="100%",a.style.color="#fff"),a.style.visibility="visible",t.style.visibility="hidden"}else{t.style.visibility="visible";var s=t.$newDom;s&&(s.style.visibility="hidden")}}function a(){var t=document.querySelector(".js-overlay"),n=document.querySelector(".js-header-menu");c(t,document.body.scrollTop,-63,2,0),c(n,document.body.scrollTop,1,3,0)}function s(){document.querySelector("#container").addEventListener("scroll",function(t){a()}),window.addEventListener("scroll",function(t){a()}),a()}function l(){x.default.versions.mobile&&window.screen.width<800&&(i(),s())}var p=e(71),d=r(p),v=e(72),y=(r(v),e(84)),h=r(y),b=e(69),x=r(b),m=e(75),g=r(m),w=e(70);l(),(0,w.addLoadEvent)(function(){g.default.init()}),t.exports={}},function(t,n){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(49),o=e(15);t.exports=function(t){return r(o(t))}},function(t,n,e){t.exports=!e(8)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n,e){var r=e(6),o=e(12);t.exports=e(4)?function(t,n,e){return r.f(t,n,o(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(10),o=e(30),i=e(24),u=Object.defineProperty;n.f=e(4)?Object.defineProperty:function(t,n,e){if(r(t),n=i(n,!0),r(e),o)try{return u(t,n,e)}catch(t){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(22)("wks"),o=e(13),i=e(1).Symbol,u="function"==typeof i,f=t.exports=function(t){return r[t]||(r[t]=u&&i[t]||(u?i:o)("Symbol."+t))};f.store=r},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r=e(35),o=e(16);t.exports=Object.keys||function(t){return r(t,o)}},function(t,n,e){var r=e(11);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++e+r).toString(36))}},function(t,n){var e=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=e)},function(t,n){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n){t.exports={}},function(t,n){t.exports=!0},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var r=e(6).f,o=e(2),i=e(7)("toStringTag");t.exports=function(t,n,e){t&&!o(t=e?t:t.prototype,i)&&r(t,i,{configurable:!0,value:n})}},function(t,n,e){var r=e(22)("keys"),o=e(13);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,n,e){var r=e(1),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(11);t.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,n,e){var r=e(1),o=e(14),i=e(18),u=e(26),f=e(6).f;t.exports=function(t){var n=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==t.charAt(0)||t in n||f(n,t,{value:u.f(t)})}},function(t,n,e){n.f=e(7)},function(t,n,e){var r=e(1),o=e(14),i=e(46),u=e(5),f="prototype",c=function(t,n,e){var a,s,l,p=t&c.F,d=t&c.G,v=t&c.S,y=t&c.P,h=t&c.B,b=t&c.W,x=d?o:o[n]||(o[n]={}),m=x[f],g=d?r:v?r[n]:(r[n]||{})[f];d&&(e=n);for(a in e)s=!p&&g&&void 0!==g[a],s&&a in x||(l=s?g[a]:e[a],x[a]=d&&"function"!=typeof g[a]?e[a]:h&&s?i(l,r):b&&g[a]==l?function(t){var n=function(n,e,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,e)}return new t(n,e,r)}return t.apply(this,arguments)};return n[f]=t[f],n}(l):y&&"function"==typeof l?i(Function.call,l):l,y&&((x.virtual||(x.virtual={}))[a]=l,t&c.R&&m&&!m[a]&&u(m,a,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n,e){var r=e(11),o=e(1).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,n,e){t.exports=!e(4)&&!e(8)(function(){return 7!=Object.defineProperty(e(29)("div"),"a",{get:function(){return 7}}).a})},function(t,n,e){"use strict";var r=e(18),o=e(27),i=e(36),u=e(5),f=e(2),c=e(17),a=e(51),s=e(20),l=e(58),p=e(7)("iterator"),d=!([].keys&&"next"in[].keys()),v="@@iterator",y="keys",h="values",b=function(){return this};t.exports=function(t,n,e,x,m,g,w){a(e,n,x);var O,S,_,j=function(t){if(!d&&t in A)return A[t];switch(t){case y:return function(){return new e(this,t)};case h:return function(){return new e(this,t)}}return function(){return new e(this,t)}},P=n+" Iterator",E=m==h,M=!1,A=t.prototype,T=A[p]||A[v]||m&&A[m],L=T||j(m),N=m?E?j("entries"):L:void 0,C="Array"==n?A.entries||T:T;if(C&&(_=l(C.call(new t)),_!==Object.prototype&&(s(_,P,!0),r||f(_,p)||u(_,p,b))),E&&T&&T.name!==h&&(M=!0,L=function(){return T.call(this)}),r&&!w||!d&&!M&&A[p]||u(A,p,L),c[n]=L,c[P]=b,m)if(O={values:E?L:j(h),keys:g?L:j(y),entries:N},w)for(S in O)S in A||i(A,S,O[S]);else o(o.P+o.F*(d||M),n,O);return O}},function(t,n,e){var r=e(10),o=e(55),i=e(16),u=e(21)("IE_PROTO"),f=function(){},c="prototype",a=function(){var t,n=e(29)("iframe"),r=i.length,o="<",u=">";for(n.style.display="none",e(48).appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write(o+"script"+u+"document.F=Object"+o+"/script"+u),t.close(),a=t.F;r--;)delete a[c][i[r]];return a()};t.exports=Object.create||function(t,n){var e;return null!==t?(f[c]=r(t),e=new f,f[c]=null,e[u]=t):e=a(),void 0===n?e:o(e,n)}},function(t,n,e){var r=e(35),o=e(16).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(2),o=e(3),i=e(45)(!1),u=e(21)("IE_PROTO");t.exports=function(t,n){var e,f=o(t),c=0,a=[];for(e in f)e!=u&&r(f,e)&&a.push(e);for(;n.length>c;)r(f,e=n[c++])&&(~i(a,e)||a.push(e));return a}},function(t,n,e){t.exports=e(5)},function(t,n,e){var r=e(15);t.exports=function(t){return Object(r(t))}},function(t,n,e){t.exports={default:e(41),__esModule:!0}},function(t,n,e){t.exports={default:e(42),__esModule:!0}},function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var o=e(39),i=r(o),u=e(38),f=r(u),c="function"==typeof f.default&&"symbol"==typeof i.default?function(t){return typeof t}:function(t){return t&&"function"==typeof f.default&&t.constructor===f.default&&t!==f.default.prototype?"symbol":typeof t};n.default="function"==typeof f.default&&"symbol"===c(i.default)?function(t){return"undefined"==typeof t?"undefined":c(t)}:function(t){return t&&"function"==typeof f.default&&t.constructor===f.default&&t!==f.default.prototype?"symbol":"undefined"==typeof t?"undefined":c(t)}},function(t,n,e){e(65),e(63),e(66),e(67),t.exports=e(14).Symbol},function(t,n,e){e(64),e(68),t.exports=e(26).f("iterator")},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n){t.exports=function(){}},function(t,n,e){var r=e(3),o=e(61),i=e(60);t.exports=function(t){return function(n,e,u){var f,c=r(n),a=o(c.length),s=i(u,a);if(t&&e!=e){for(;a>s;)if(f=c[s++],f!=f)return!0}else for(;a>s;s++)if((t||s in c)&&c[s]===e)return t||s||0;return!t&&-1}}},function(t,n,e){var r=e(43);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},function(t,n,e){var r=e(9),o=e(34),i=e(19);t.exports=function(t){var n=r(t),e=o.f;if(e)for(var u,f=e(t),c=i.f,a=0;f.length>a;)c.call(t,u=f[a++])&&n.push(u);return n}},function(t,n,e){t.exports=e(1).document&&document.documentElement},function(t,n,e){var r=e(28);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,n,e){var r=e(28);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,n,e){"use strict";var r=e(32),o=e(12),i=e(20),u={};e(5)(u,e(7)("iterator"),function(){return this}),t.exports=function(t,n,e){t.prototype=r(u,{next:o(1,e)}),i(t,n+" Iterator")}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,e){var r=e(9),o=e(3);t.exports=function(t,n){for(var e,i=o(t),u=r(i),f=u.length,c=0;f>c;)if(i[e=u[c++]]===n)return e}},function(t,n,e){var r=e(13)("meta"),o=e(11),i=e(2),u=e(6).f,f=0,c=Object.isExtensible||function(){return!0},a=!e(8)(function(){return c(Object.preventExtensions({}))}),s=function(t){u(t,r,{value:{i:"O"+ ++f,w:{}}})},l=function(t,n){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!n)return"E";s(t)}return t[r].i},p=function(t,n){if(!i(t,r)){if(!c(t))return!0;if(!n)return!1;s(t)}return t[r].w},d=function(t){return a&&v.NEED&&c(t)&&!i(t,r)&&s(t),t},v=t.exports={KEY:r,NEED:!1,fastKey:l,getWeak:p,onFreeze:d}},function(t,n,e){var r=e(6),o=e(10),i=e(9);t.exports=e(4)?Object.defineProperties:function(t,n){o(t);for(var e,u=i(n),f=u.length,c=0;f>c;)r.f(t,e=u[c++],n[e]);return t}},function(t,n,e){var r=e(19),o=e(12),i=e(3),u=e(24),f=e(2),c=e(30),a=Object.getOwnPropertyDescriptor;n.f=e(4)?a:function(t,n){if(t=i(t),n=u(n,!0),c)try{return a(t,n)}catch(t){}if(f(t,n))return o(!r.f.call(t,n),t[n])}},function(t,n,e){var r=e(3),o=e(33).f,i={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],f=function(t){try{return o(t)}catch(t){return u.slice()}};t.exports.f=function(t){return u&&"[object Window]"==i.call(t)?f(t):o(r(t))}},function(t,n,e){var r=e(2),o=e(37),i=e(21)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,e){var r=e(23),o=e(15);t.exports=function(t){return function(n,e){var i,u,f=String(o(n)),c=r(e),a=f.length;return c<0||c>=a?t?"":void 0:(i=f.charCodeAt(c),i<55296||i>56319||c+1===a||(u=f.charCodeAt(c+1))<56320||u>57343?t?f.charAt(c):i:t?f.slice(c,c+2):(i-55296<<10)+(u-56320)+65536)}}},function(t,n,e){var r=e(23),o=Math.max,i=Math.min;t.exports=function(t,n){return t=r(t),t<0?o(t+n,0):i(t,n)}},function(t,n,e){var r=e(23),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,n,e){"use strict";var r=e(44),o=e(52),i=e(17),u=e(3);t.exports=e(31)(Array,"Array",function(t,n){this._t=u(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=void 0,o(1)):"keys"==n?o(0,e):"values"==n?o(0,t[e]):o(0,[e,t[e]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,n){},function(t,n,e){"use strict";var r=e(59)(!0);e(31)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,e=this._i;return e>=n.length?{value:void 0,done:!0}:(t=r(n,e),this._i+=t.length,{value:t,done:!1})})},function(t,n,e){"use strict";var r=e(1),o=e(2),i=e(4),u=e(27),f=e(36),c=e(54).KEY,a=e(8),s=e(22),l=e(20),p=e(13),d=e(7),v=e(26),y=e(25),h=e(53),b=e(47),x=e(50),m=e(10),g=e(3),w=e(24),O=e(12),S=e(32),_=e(57),j=e(56),P=e(6),E=e(9),M=j.f,A=P.f,T=_.f,L=r.Symbol,N=r.JSON,C=N&&N.stringify,k="prototype",F=d("_hidden"),q=d("toPrimitive"),I={}.propertyIsEnumerable,B=s("symbol-registry"),D=s("symbols"),W=s("op-symbols"),H=Object[k],K="function"==typeof L,R=r.QObject,J=!R||!R[k]||!R[k].findChild,U=i&&a(function(){return 7!=S(A({},"a",{get:function(){return A(this,"a",{value:7}).a}})).a})?function(t,n,e){var r=M(H,n);r&&delete H[n],A(t,n,e),r&&t!==H&&A(H,n,r)}:A,G=function(t){var n=D[t]=S(L[k]);return n._k=t,n},$=K&&"symbol"==typeof L.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof L},z=function(t,n,e){return t===H&&z(W,n,e),m(t),n=w(n,!0),m(e),o(D,n)?(e.enumerable?(o(t,F)&&t[F][n]&&(t[F][n]=!1),e=S(e,{enumerable:O(0,!1)})):(o(t,F)||A(t,F,O(1,{})),t[F][n]=!0),U(t,n,e)):A(t,n,e)},Y=function(t,n){m(t);for(var e,r=b(n=g(n)),o=0,i=r.length;i>o;)z(t,e=r[o++],n[e]);return t},Q=function(t,n){return void 0===n?S(t):Y(S(t),n)},X=function(t){var n=I.call(this,t=w(t,!0));return!(this===H&&o(D,t)&&!o(W,t))&&(!(n||!o(this,t)||!o(D,t)||o(this,F)&&this[F][t])||n)},V=function(t,n){if(t=g(t),n=w(n,!0),t!==H||!o(D,n)||o(W,n)){var e=M(t,n);return!e||!o(D,n)||o(t,F)&&t[F][n]||(e.enumerable=!0),e}},Z=function(t){for(var n,e=T(g(t)),r=[],i=0;e.length>i;)o(D,n=e[i++])||n==F||n==c||r.push(n);return r},tt=function(t){for(var n,e=t===H,r=T(e?W:g(t)),i=[],u=0;r.length>u;)!o(D,n=r[u++])||e&&!o(H,n)||i.push(D[n]);return i};K||(L=function(){if(this instanceof L)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:void 0),n=function(e){this===H&&n.call(W,e),o(this,F)&&o(this[F],t)&&(this[F][t]=!1),U(this,t,O(1,e))};return i&&J&&U(H,t,{configurable:!0,set:n}),G(t)},f(L[k],"toString",function(){return this._k}),j.f=V,P.f=z,e(33).f=_.f=Z,e(19).f=X,e(34).f=tt,i&&!e(18)&&f(H,"propertyIsEnumerable",X,!0),v.f=function(t){return G(d(t))}),u(u.G+u.W+u.F*!K,{Symbol:L});for(var nt="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),et=0;nt.length>et;)d(nt[et++]);for(var nt=E(d.store),et=0;nt.length>et;)y(nt[et++]);u(u.S+u.F*!K,"Symbol",{for:function(t){return o(B,t+="")?B[t]:B[t]=L(t)},keyFor:function(t){if($(t))return h(B,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){J=!0},useSimple:function(){J=!1}}),u(u.S+u.F*!K,"Object",{create:Q,defineProperty:z,defineProperties:Y,getOwnPropertyDescriptor:V,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),N&&u(u.S+u.F*(!K||a(function(){var t=L();return"[null]"!=C([t])||"{}"!=C({a:t})||"{}"!=C(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!$(t)){for(var n,e,r=[t],o=1;arguments.length>o;)r.push(arguments[o++]);return n=r[1],"function"==typeof n&&(e=n),!e&&x(n)||(n=function(t,n){if(e&&(n=e.call(this,t,n)),!$(n))return n}),r[1]=n,C.apply(N,r)}}}),L[k][q]||e(5)(L[k],q,L[k].valueOf),l(L,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},function(t,n,e){e(25)("asyncIterator")},function(t,n,e){e(25)("observable")},function(t,n,e){e(62);for(var r=e(1),o=e(5),i=e(17),u=e(7)("toStringTag"),f=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],c=0;c<5;c++){var a=f[c],s=r[a],l=s&&s.prototype;l&&!l[u]&&o(l,u,a),i[a]=i.Array}},function(t,n){"use strict";var e={versions:function(){var t=window.navigator.userAgent;return{trident:t.indexOf("Trident")>-1,presto:t.indexOf("Presto")>-1,webKit:t.indexOf("AppleWebKit")>-1,gecko:t.indexOf("Gecko")>-1&&t.indexOf("KHTML")==-1,mobile:!!t.match(/AppleWebKit.*Mobile.*/),ios:!!t.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),android:t.indexOf("Android")>-1||t.indexOf("Linux")>-1,iPhone:t.indexOf("iPhone")>-1||t.indexOf("Mac")>-1,iPad:t.indexOf("iPad")>-1,webApp:t.indexOf("Safari")==-1,weixin:t.indexOf("MicroMessenger")==-1}}()};t.exports=e},function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}var o=e(40),i=r(o),u=function(){function t(t,n,e){return n||e?String.fromCharCode(n||e):o[t]||t}function n(t){return l[t]}var e=/"|<|>|&| |'|&#(\d+);|&#(\d+)/g,r=/['<> "&]/g,o={""":'"',"<":"<",">":">","&":"&"," ":" "},f=/\u00a0/g,c=/<br\s*\/?>/gi,a=/\r?\n/g,s=/\s/g,l={};for(var p in o)l[o[p]]=p;return o["'"]="'",l["'"]="'",{encode:function(t){return t?(""+t).replace(r,n).replace(a,"<br/>").replace(s," "):""},decode:function(n){return n?(""+n).replace(c,"\n").replace(e,t).replace(f," "):""},encodeBase16:function(t){if(!t)return t;t+="";for(var n=[],e=0,r=t.length;r>e;e++)n.push(t.charCodeAt(e).toString(16).toUpperCase());return n.join("")},encodeBase16forJSON:function(t){if(!t)return t;t=t.replace(/[\u4E00-\u9FBF]/gi,function(t){return escape(t).replace("%u","\\u")});for(var n=[],e=0,r=t.length;r>e;e++)n.push(t.charCodeAt(e).toString(16).toUpperCase());return n.join("")},decodeBase16:function(t){if(!t)return t;t+="";for(var n=[],e=0,r=t.length;r>e;e+=2)n.push(String.fromCharCode("0x"+t.slice(e,e+2)));return n.join("")},encodeObject:function(t){if(t instanceof Array)for(var n=0,e=t.length;e>n;n++)t[n]=u.encodeObject(t[n]);else if("object"==("undefined"==typeof t?"undefined":(0,i.default)(t)))for(var r in t)t[r]=u.encodeObject(t[r]);else if("string"==typeof t)return u.encode(t);return t},loadScript:function(t){var n=document.createElement("script");document.getElementsByTagName("body")[0].appendChild(n),n.setAttribute("src",t)},addLoadEvent:function(t){var n=window.onload;"function"!=typeof window.onload?window.onload=t:window.onload=function(){n(),t()}}}}();t.exports=u},function(t,n){function e(t,n){t.classList?t.classList.add(n):t.className+=" "+n}t.exports=e},function(t,n){function e(t,n){if(t.classList)t.classList.remove(n);else{var e=new RegExp("(^|\\b)"+n.split(" ").join("|")+"(\\b|$)","gi");t.className=t.className.replace(e," ")}}t.exports=e},,,function(t,n){"use strict";function e(){var t=document.querySelector("#page-nav");if(t&&!document.querySelector("#page-nav .extend.prev")&&(t.innerHTML='<a class="extend prev disabled" rel="prev">« Prev</a>'+t.innerHTML),t&&!document.querySelector("#page-nav .extend.next")&&(t.innerHTML=t.innerHTML+'<a class="extend next disabled" rel="next">Next »</a>'),yiliaConfig&&yiliaConfig.open_in_new){var n=document.querySelectorAll(".article-entry a:not(.article-more-a)");n.forEach(function(t){t.setAttribute("target","_blank")})}var e=document.querySelector("#js-aboutme");e&&0!==e.length&&(e.innerHTML=e.innerText)}t.exports={init:e}},,,,,,,,,function(t,n){function e(t,n){if("string"==typeof n)return t.insertAdjacentHTML("afterend",n);var e=t.nextSibling;return e?t.parentNode.insertBefore(n,e):t.parentNode.appendChild(n)}t.exports=e}])</script><script src="/./main.2d7529.js"></script><script>!function(){var e=function(e){var t=document.createElement("script");document.getElementsByTagName("body")[0].appendChild(t),t.setAttribute("src",e)};e("/slider.885efe.js")}()</script>
<div class="tools-col" q-class="show:isShow,hide:isShow|isFalse" q-on="click:stop(e)">
<div class="tools-nav header-menu">
<ul style="width: 70%">
<li style="width: 33.333333333333336%" q-on="click: openSlider(e, 'innerArchive')"><a href="javascript:void(0)" q-class="active:innerArchive">所有文章</a></li>
<li style="width: 33.333333333333336%" q-on="click: openSlider(e, 'friends')"><a href="javascript:void(0)" q-class="active:friends">友链</a></li>
<li style="width: 33.333333333333336%" q-on="click: openSlider(e, 'aboutme')"><a href="javascript:void(0)" q-class="active:aboutme">关于我</a></li>
</ul>
</div>
<div class="tools-wrap">
<section class="tools-section tools-section-all" q-show="innerArchive">
<div class="search-wrap">
<input class="search-ipt" q-model="search" type="text" placeholder="find something…">
<i class="icon-search icon" q-show="search|isEmptyStr"></i>
<i class="icon-close icon" q-show="search|isNotEmptyStr" q-on="click:clearChose(e)"></i>
</div>
<div class="widget tagcloud search-tag">
<p class="search-tag-wording">tag:</p>
<label class="search-switch">
<input type="checkbox" q-on="click:toggleTag(e)" q-attr="checked:showTags">
</label>
<ul class="article-tag-list" q-show="showTags">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag color5">util</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag color4">多线程</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag color5">java</a>
</li>
<div class="clearfix"></div>
</ul>
</div>
<ul class="search-ul">
<p q-show="jsonFail" style="padding: 20px; font-size: 12px;">
缺失模块。<br/>1、在博客根目录(注意不是yilia根目录)执行以下命令:<br/> npm i hexo-generator-json-content --save<br/><br/>
2、在根目录_config.yml里添加配置:
<pre style="font-size: 12px;" q-show="jsonFail">
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: true
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true
</pre>
</p>
<li class="search-li" q-repeat="items" q-show="isShow">
<a q-attr="href:path|urlformat" class="search-title"><i class="icon-quo-left icon"></i><span q-text="title"></span></a>
<p class="search-time">
<i class="icon-calendar icon"></i>
<span q-text="date|dateformat"></span>
</p>
<p class="search-tag">
<i class="icon-price-tags icon"></i>
<span q-repeat="tags" q-on="click:choseTag(e, name)" q-text="name|tagformat"></span>
</p>
</li>
</ul>
</section>
<section class="tools-section tools-section-friends" q-show="friends">
<ul class="search-ul">
<li class="search-li">
<a href="http://www.jikedaohang.com/" target="_blank" class="search-title"><i class="icon-quo-left icon"></i>程序员自己的导航</a>
</li>
<li class="search-li">
<a href="http://www.jianshu.com/u/0b56772ce32e" target="_blank" class="search-title"><i class="icon-quo-left icon"></i>我的简书</a>
</li>
<li class="search-li">
<a href="http://my.csdn.net/u013243573" target="_blank" class="search-title"><i class="icon-quo-left icon"></i>CSDN账号</a>
</li>
</ul>
</section>
<section class="tools-section tools-section-me" q-show="aboutme">
<div class="aboutme-wrap" id="js-aboutme">很惭愧<br>只做了一点微小的工作<br><br>身体与灵魂,必须有一个在路上。</div>
</section>
</div>
</div>
<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
<!-- Background of PhotoSwipe.
It's a separate element as animating opacity is faster than rgba(). -->
<div class="pswp__bg"></div>
<!-- Slides wrapper with overflow:hidden. -->
<div class="pswp__scroll-wrap">
<!-- Container that holds slides.
PhotoSwipe keeps only 3 of them in the DOM to save memory.
Don't modify these 3 pswp__item elements, data is added later on. -->
<div class="pswp__container">
<div class="pswp__item"></div>
<div class="pswp__item"></div>
<div class="pswp__item"></div>
</div>
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<!-- Controls are self-explanatory. Order can be changed. -->
<div class="pswp__counter"></div>
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
<!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
<!-- element will get class pswp__preloader--active when preloader is running -->
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
<div class="pswp__share-tooltip"></div>
</div>
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
</button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
</button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>