﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天下</title><link>http://www.cppblog.com/aaxron/</link><description>记录修行的印记
</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 05:13:36 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 05:13:36 GMT</pubDate><ttl>60</ttl><item><title>单文件AES加解密算法</title><link>http://www.cppblog.com/aaxron/archive/2021/08/30/217802.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 30 Aug 2021 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2021/08/30/217802.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217802.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2021/08/30/217802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217802.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217802.html</trackback:ping><description><![CDATA[#pragma&#160;once
&#160;
#include&#160;<stdint.h>&#160;&#160;//for int8_t
#include&#160;<string.h>&#160;&#160;//for memcmp
#include&#160;<wmmintrin.h>&#160;//for intrinsics for AES-NI
//compile using gcc and following arguments: -g;-O0;-Wall;-msse2;-msse;-march=native;-maes
//internal stuff
&#160;
//macros
#define&#160;DO_ENC_BLOCK(m,k) \
&#160;&#160;&#160;&#160;do{\
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_xor_si128&#160;&#160;(m, k[ 0]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 1]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 2]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 3]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 4]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 5]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 6]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 7]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 8]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 9]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenclast_si128(m, k[10]);\
&#160;&#160;&#160;&#160;}while(0)
&#160;
#define&#160;DO_DEC_BLOCK(m,k) \
&#160;&#160;&#160;&#160;do{\
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_xor_si128&#160;&#160;(m, k[10+0]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+1]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+2]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+3]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+4]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+5]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+6]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+7]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+8]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+9]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdeclast_si128(m, k[0]);\
&#160;&#160;&#160;&#160;}while(0)
&#160;
#define&#160;AES_128_key_exp(k, rcon) aes_128_key_expansion(k, _mm_aeskeygenassist_si128(k, rcon))
&#160;
static&#160;__m128i&#160;aes_128_key_expansion(__m128i&#160;key, __m128i&#160;keygened)
{
&#160;&#160;&#160;&#160;keygened&#160;= _mm_shuffle_epi32(keygened, _MM_SHUFFLE(3,3,3,3));
&#160;&#160;&#160;&#160;key&#160;= _mm_xor_si128(key, _mm_slli_si128(key, 4));
&#160;&#160;&#160;&#160;key&#160;= _mm_xor_si128(key, _mm_slli_si128(key, 4));
&#160;&#160;&#160;&#160;key&#160;= _mm_xor_si128(key, _mm_slli_si128(key, 4));
&#160;&#160;&#160;&#160;return&#160;_mm_xor_si128(key, keygened);
}
&#160;
//public API
static&#160;void&#160;aes128_load_key_enc_only(uint8_t&#160;*enc_key, __m128i&#160;*key_schedule)
{
&#160;&#160;&#160;&#160;key_schedule[0] = _mm_loadu_si128((const&#160;__m128i*) enc_key);
&#160;&#160;&#160;&#160;key_schedule[1] = AES_128_key_exp(key_schedule[0], 0x01);
&#160;&#160;&#160;&#160;key_schedule[2] = AES_128_key_exp(key_schedule[1], 0x02);
&#160;&#160;&#160;&#160;key_schedule[3] = AES_128_key_exp(key_schedule[2], 0x04);
&#160;&#160;&#160;&#160;key_schedule[4] = AES_128_key_exp(key_schedule[3], 0x08);
&#160;&#160;&#160;&#160;key_schedule[5] = AES_128_key_exp(key_schedule[4], 0x10);
&#160;&#160;&#160;&#160;key_schedule[6] = AES_128_key_exp(key_schedule[5], 0x20);
&#160;&#160;&#160;&#160;key_schedule[7] = AES_128_key_exp(key_schedule[6], 0x40);
&#160;&#160;&#160;&#160;key_schedule[8] = AES_128_key_exp(key_schedule[7], 0x80);
&#160;&#160;&#160;&#160;key_schedule[9] = AES_128_key_exp(key_schedule[8], 0x1B);
&#160;&#160;&#160;&#160;key_schedule[10] = AES_128_key_exp(key_schedule[9], 0x36);
}
&#160;
static&#160;void&#160;aes128_load_key(uint8_t&#160;*enc_key, __m128i&#160;*key_schedule)
{
&#160;&#160;&#160;&#160;aes128_load_key_enc_only(enc_key, key_schedule);
&#160;
&#160;&#160;&#160;&#160;// generate decryption keys in reverse order.
&#160;&#160;&#160;&#160;// k[10] is shared by last encryption and first decryption rounds
&#160;&#160;&#160;&#160;// k[0] is shared by first encryption round and last decryption round (and is the original user key)
&#160;&#160;&#160;&#160;// For some implementation reasons, decryption key schedule is NOT the encryption key schedule in reverse order
&#160;&#160;&#160;&#160;key_schedule[11] = _mm_aesimc_si128(key_schedule[9]);
&#160;&#160;&#160;&#160;key_schedule[12] = _mm_aesimc_si128(key_schedule[8]);
&#160;&#160;&#160;&#160;key_schedule[13] = _mm_aesimc_si128(key_schedule[7]);
&#160;&#160;&#160;&#160;key_schedule[14] = _mm_aesimc_si128(key_schedule[6]);
&#160;&#160;&#160;&#160;key_schedule[15] = _mm_aesimc_si128(key_schedule[5]);
&#160;&#160;&#160;&#160;key_schedule[16] = _mm_aesimc_si128(key_schedule[4]);
&#160;&#160;&#160;&#160;key_schedule[17] = _mm_aesimc_si128(key_schedule[3]);
&#160;&#160;&#160;&#160;key_schedule[18] = _mm_aesimc_si128(key_schedule[2]);
&#160;&#160;&#160;&#160;key_schedule[19] = _mm_aesimc_si128(key_schedule[1]);
}
&#160;
static&#160;void&#160;aes128_enc(__m128i&#160;*key_schedule, uint8_t&#160;*plainText,uint8_t&#160;*cipherText)
{
&#160;&#160;&#160;&#160;__m128i&#160;m&#160;= _mm_loadu_si128((__m128i&#160;*) plainText);
&#160;&#160;&#160;&#160;DO_ENC_BLOCK(m,key_schedule);
&#160;&#160;&#160;&#160;_mm_storeu_si128((__m128i&#160;*) cipherText, m);
}
&#160;
static&#160;void&#160;aes128_dec(__m128i&#160;*key_schedule, uint8_t&#160;*cipherText,uint8_t&#160;*plainText)
{
&#160;&#160;&#160;&#160;__m128i&#160;m&#160;= _mm_loadu_si128((__m128i&#160;*) cipherText);
&#160;&#160;&#160;&#160;DO_DEC_BLOCK(m,key_schedule);
&#160;&#160;&#160;&#160;_mm_storeu_si128((__m128i&#160;*) plainText, m);
}
&#160;
//return 0 if no error
//1 if encryption failed
//2 if decryption failed
//3 if both failed
static&#160;int&#160;aes128_self_test(void)
{
&#160;&#160;&#160;&#160;uint8_t&#160;plain[] &#160;= {0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34};
&#160;&#160;&#160;&#160;uint8_t&#160;enc_key[] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
&#160;&#160;&#160;&#160;uint8_t&#160;cipher[] &#160;= {0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb, 0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32};
&#160;&#160;&#160;&#160;uint8_t&#160;computed_cipher[16];
&#160;&#160;&#160;&#160;uint8_t&#160;computed_plain[16];
&#160;&#160;&#160;&#160;int&#160;out=0;
&#160;&#160;&#160;&#160;__m128i&#160;key_schedule[20];
&#160;&#160;&#160;&#160;aes128_load_key(enc_key,key_schedule);
&#160;&#160;&#160;&#160;aes128_enc(key_schedule,plain,computed_cipher);
&#160;&#160;&#160;&#160;aes128_dec(key_schedule,cipher,computed_plain);
&#160;&#160;&#160;&#160;if(memcmp(cipher,computed_cipher,sizeof(cipher))) out=1;
&#160;&#160;&#160;&#160;if(memcmp(plain,computed_plain,sizeof(plain))) out|=2;
&#160;&#160;&#160;&#160;return&#160;out;
}<img src ="http://www.cppblog.com/aaxron/aggbug/217802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2021-08-30 21:39 <a href="http://www.cppblog.com/aaxron/archive/2021/08/30/217802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt状态机代码例子</title><link>http://www.cppblog.com/aaxron/archive/2021/03/31/217647.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 31 Mar 2021 13:12:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2021/03/31/217647.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217647.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2021/03/31/217647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217647.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217647.html</trackback:ping><description><![CDATA[<div>#include "stdafx.h"</div><div>#include "qtapplication03.h"</div><div>#include "ButtonChanged.h"</div><div>#include &lt;QtWidgets/QApplication&gt;</div><div></div><div>int main(int argc, char *argv[])</div><div>{</div><div><span style="white-space: pre;">	</span>QApplication a(argc, argv);</div><div><span style="white-space: pre;">	</span>QPushButton button("State Machine");</div><div></div><div><span style="white-space: pre;">	</span>QStateMachine machine;</div><div><span style="white-space: pre;">	</span>ButtonChanged* bc = new ButtonChanged(&amp;machine);</div><div><span style="white-space: pre;">	</span>QState* s1 = new QState(&amp;machine);</div><div><span style="white-space: pre;">	</span>QState* s2 = new QState(&amp;machine);</div><div><span style="white-space: pre;">	</span>QState* s3 = new QState(&amp;machine);</div><div></div><div><span style="white-space: pre;">	</span>s1-&gt;assignProperty(&amp;button, "geometry", QRect(100, 100, 120, 50));</div><div><span style="white-space: pre;">	</span>s2-&gt;assignProperty(&amp;button, "geometry", QRect(100, 100, 220, 50));</div><div><span style="white-space: pre;">	</span>s3-&gt;assignProperty(&amp;button, "geometry", QRect(100, 100, 320, 50));</div><div></div><div><span style="white-space: pre;">	</span>s1-&gt;addTransition(&amp;button, SIGNAL(clicked()), s2);</div><div><span style="white-space: pre;">	</span>s2-&gt;addTransition(&amp;button, SIGNAL(clicked()), s3);</div><div><span style="white-space: pre;">	</span>s3-&gt;addTransition(&amp;button, SIGNAL(clicked()), s1);</div><div></div><div><span style="white-space: pre;">	</span>machine.setInitialState(s1);</div><div><span style="white-space: pre;">	</span>machine.start();</div><div><span style="white-space: pre;">	</span>button.show();</div><div></div><div><span style="white-space: pre;">	</span>QObject::connect(s3, &amp;QState::entered, bc, &amp;ButtonChanged::changed);</div><div><span style="white-space: pre;">	</span>return a.exec();</div><div>}</div><div></div><img src ="http://www.cppblog.com/aaxron/aggbug/217647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2021-03-31 21:12 <a href="http://www.cppblog.com/aaxron/archive/2021/03/31/217647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaFX BindingTest3</title><link>http://www.cppblog.com/aaxron/archive/2020/01/01/217053.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 01 Jan 2020 05:47:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2020/01/01/217053.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217053.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2020/01/01/217053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217053.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217053.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;application.chapter2;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javafx.beans.binding.NumberBinding;<br /><span style="color: #0000FF; ">import</span>&nbsp;javafx.beans.property.IntegerProperty;<br /><span style="color: #0000FF; ">import</span>&nbsp;javafx.beans.property.SimpleIntegerProperty;<br /><span style="color: #0000FF; ">import</span>&nbsp;javafx.beans.value.ObservableValue;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;BindingTest3&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntegerProperty&nbsp;x&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SimpleIntegerProperty(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntegerProperty&nbsp;y&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SimpleIntegerProperty(200);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;a&nbsp;binding:&nbsp;sum&nbsp;=&nbsp;x&nbsp;+&nbsp;y</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberBinding&nbsp;sum&nbsp;=&nbsp;x.add(y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("After&nbsp;creating&nbsp;sum");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sum.isValid():&nbsp;"&nbsp;+&nbsp;sum.isValid());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Let&nbsp;us&nbsp;get&nbsp;the&nbsp;value&nbsp;of&nbsp;sum,&nbsp;so&nbsp;it&nbsp;computes&nbsp;its&nbsp;value&nbsp;and<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;becomes&nbsp;valid</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;value&nbsp;=&nbsp;sum.intValue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\nAfter&nbsp;requesting&nbsp;value");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sum.isValid():&nbsp;"&nbsp;+&nbsp;sum.isValid());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sum&nbsp;=&nbsp;"&nbsp;+&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Change&nbsp;the&nbsp;value&nbsp;of&nbsp;x</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.set(250);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\nAfter&nbsp;changing&nbsp;x");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sum.isValid():&nbsp;"&nbsp;+&nbsp;sum.isValid());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Get&nbsp;the&nbsp;value&nbsp;of&nbsp;sum&nbsp;again</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;sum.intValue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\nAfter&nbsp;requesting&nbsp;value");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sum.isValid():&nbsp;"&nbsp;+&nbsp;sum.isValid());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sum&nbsp;=&nbsp;"&nbsp;+&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.cppblog.com/aaxron/aggbug/217053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2020-01-01 13:47 <a href="http://www.cppblog.com/aaxron/archive/2020/01/01/217053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaFX PropertyTest2 </title><link>http://www.cppblog.com/aaxron/archive/2020/01/01/217052.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 01 Jan 2020 05:19:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2020/01/01/217052.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217052.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2020/01/01/217052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217052.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217052.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;application.chapter2;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javafx.beans.property.IntegerProperty;<br /><span style="color: #0000FF; ">import</span>&nbsp;javafx.beans.property.SimpleIntegerProperty;<br /><span style="color: #0000FF; ">import</span>&nbsp;javafx.beans.value.ObservableValue;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;PropertyTest2&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntegerProperty&nbsp;counter&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SimpleIntegerProperty(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Add&nbsp;an&nbsp;invalidation&nbsp;listener&nbsp;to&nbsp;the&nbsp;counter&nbsp;property</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter.addListener(PropertyTest2::changed);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Before&nbsp;changing&nbsp;the&nbsp;counter&nbsp;value-1");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter.set(101);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("After&nbsp;changing&nbsp;the&nbsp;counter&nbsp;value-1");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;At&nbsp;this&nbsp;point&nbsp;counter&nbsp;property&nbsp;is&nbsp;invalid&nbsp;and&nbsp;further&nbsp;changes&nbsp;to&nbsp;its&nbsp;value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;will&nbsp;not&nbsp;generate&nbsp;invalidation&nbsp;events.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\nBefore&nbsp;changing&nbsp;the&nbsp;counter&nbsp;value-2");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter.set(102);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("After&nbsp;changing&nbsp;the&nbsp;counter&nbsp;value-2");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Make&nbsp;the&nbsp;counter&nbsp;property&nbsp;valid&nbsp;by&nbsp;calling&nbsp;its&nbsp;get()&nbsp;method</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;value&nbsp;=&nbsp;counter.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Counter&nbsp;value&nbsp;=&nbsp;"&nbsp;+&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;At&nbsp;this&nbsp;point&nbsp;counter&nbsp;property&nbsp;is&nbsp;valid&nbsp;and&nbsp;further&nbsp;changes&nbsp;to&nbsp;its&nbsp;value&nbsp;will<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;generate&nbsp;invalidation&nbsp;events.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Try&nbsp;to&nbsp;set&nbsp;the&nbsp;same&nbsp;value</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\nBefore&nbsp;changing&nbsp;the&nbsp;counter&nbsp;value-3");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter.set(102);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("After&nbsp;changing&nbsp;the&nbsp;counter&nbsp;value-3");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Try&nbsp;to&nbsp;set&nbsp;a&nbsp;different&nbsp;value</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\nBefore&nbsp;changing&nbsp;the&nbsp;counter&nbsp;value-4");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter.set(103);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("After&nbsp;changing&nbsp;the&nbsp;counter&nbsp;value-4");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;changed(ObservableValue&lt;?&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Number&gt;&nbsp;prop,Number&nbsp;oldValue,Number&nbsp;newValue)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("Counter&nbsp;changed:&nbsp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Old&nbsp;=&nbsp;"&nbsp;+&nbsp;oldValue&nbsp;+&nbsp;",&nbsp;new&nbsp;=&nbsp;"&nbsp;+&nbsp;newValue);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.cppblog.com/aaxron/aggbug/217052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2020-01-01 13:19 <a href="http://www.cppblog.com/aaxron/archive/2020/01/01/217052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2、Pass a string to/from Java to/from CTag(s): JNI</title><link>http://www.cppblog.com/aaxron/archive/2019/12/06/217014.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 06 Dec 2019 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2019/12/06/217014.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217014.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2019/12/06/217014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217014.html</trackback:ping><description><![CDATA[<div>Pass a string to/from Java to/from CTag(s): JNI</div><div>To Java from C (as seen from the previous How-to) :<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"JavaHowTo.h"&nbsp;<br /><br />JNIEXPORT&nbsp;jstring&nbsp;JNICALL&nbsp;Java_JavaHowTo_sayHello<br />&nbsp;&nbsp;(JNIEnv&nbsp;*env,&nbsp;jobject&nbsp;obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;env-&gt;NewStringUTF("Hello&nbsp;world");<br />}<br />From&nbsp;Java&nbsp;to&nbsp;C&nbsp;:&nbsp;Suppose&nbsp;we&nbsp;have&nbsp;a&nbsp;Java&nbsp;Class<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyClass&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;sayHello(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;"Hello&nbsp;world&nbsp;From&nbsp;Java";<br />&nbsp;&nbsp;}<br />}</div><div>then from C, we want to call the Java sayHello() method which returns a String :</div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->JNIEXPORT&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;JNICALL&nbsp;Java_JavaHowTo_sayHello(JNIEnv&nbsp;*env,&nbsp;jobject&nbsp;obj)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*str;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;jclass&nbsp;myclass_class&nbsp;=(jclass)&nbsp;env-&gt;NewGlobalRef&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(env-&gt;FindClass&nbsp;("MyClass"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;we&nbsp;need&nbsp;the&nbsp;MyClass&nbsp;constructor&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmethodID&nbsp;constructorID&nbsp;=&nbsp;env-&gt;GetMethodID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(myclass_class,&nbsp;"",&nbsp;"()V");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;and&nbsp;the&nbsp;sayHello()&nbsp;method</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmethodID&nbsp;methodID&nbsp;=&nbsp;env-&gt;GetMethodID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(myclass_class,&nbsp;"sayHello",&nbsp;"()Ljava/lang/String;");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;instanciate&nbsp;a&nbsp;MyClass&nbsp;object</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jobject&nbsp;myclass_object&nbsp;=&nbsp;&nbsp;env-&gt;NewObject<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(myclass_class,&nbsp;constructorID);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;call&nbsp;the&nbsp;sayHello()&nbsp;method</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jstring&nbsp;s&nbsp;=&nbsp;(jstring)&nbsp;&nbsp;env-&gt;CallObjectMethod<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(myclass_object,&nbsp;methodID);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;convert&nbsp;the&nbsp;Java&nbsp;String&nbsp;to&nbsp;use&nbsp;it&nbsp;in&nbsp;C</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;=&nbsp;env-&gt;GetStringUTFChars(s,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s"&nbsp;,&nbsp;str);<br />&nbsp;&nbsp;&nbsp;&nbsp;env-&gt;ReleaseStringUTFChars(s,&nbsp;str);&nbsp;&nbsp;<br />}</div><br /><div>The Java JNI wrapper would be</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;JavaHowTo&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">native</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHello();<br />&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.loadLibrary("javahowto");&nbsp;<br />&nbsp;&nbsp;}<br />}</div><div>And finally, to use it</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JNIJavaHowTo&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;JavaHowTo&nbsp;jht&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JavaHowTo();<br />&nbsp;&nbsp;&nbsp;&nbsp;jht.sayHello();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br /><br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/aaxron/aggbug/217014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2019-12-06 10:53 <a href="http://www.cppblog.com/aaxron/archive/2019/12/06/217014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1、Use native code through JNI (HelloWorld)</title><link>http://www.cppblog.com/aaxron/archive/2019/12/06/217013.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 06 Dec 2019 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2019/12/06/217013.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217013.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2019/12/06/217013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217013.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217013.html</trackback:ping><description><![CDATA[<p style="margin:0in;font-family:微软雅黑;font-size:10.5pt"><a href="https://www.rgagnon.com/topics/java-jni.html">https://www.rgagnon.com/topics/java-jni.html</a></p>  <p style="margin:0in;font-family:微软雅黑;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-family:微软雅黑;font-size:10.5pt">Use native code through JNI (HelloWorld)</p>  <p style="margin:0in;font-family:微软雅黑;font-size:10.5pt">Use native code through JNITag(s): JNI</p>  <p style="margin:0in;font-family:微软雅黑;font-size:10.5pt">With MSVC6, create a new Win32 DLL project (simple) and call it javahowto.</p>  <span style="font-family: 微软雅黑; font-size: 10.5pt;">In the same directory create a java source called JavaHowTo.java</span>&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;JavaHowTo&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">native</span>&nbsp;String&nbsp;sayHello();<br />&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.loadLibrary("javahowto");&nbsp;<br />&nbsp;&nbsp;}<br />}</div><div>Compile the Java program and use javah utility to generate the JavaHowTo.h header file.</div><div>javah -jni JavaHowTo</div><div>In MSVC6, add the JavaHowTo.h in your project header files</div><div>In the Tools - Options menu, set the include directories to include the Java JNI headers files. They are located in [jdk dir]\include and [jdk dir]\include\win32 directories</div><div>In the javahowto.cpp source, add</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"JavaHowTo.h"&nbsp;<br /><br />JNIEXPORT&nbsp;jstring&nbsp;JNICALL&nbsp;Java_JavaHowTo_sayHello<br />&nbsp;&nbsp;(JNIEnv&nbsp;*env,&nbsp;jobject&nbsp;obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;env-&gt;NewStringUTF("Hello&nbsp;world");<br />}</div><div>Select the Release configuration and build the project.</div><div>Copy the javahowto.dll in the same directory as the java program.</div><div>Create this new java program<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JNIJavaHowTo&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;JavaHowTo&nbsp;jht&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JavaHowTo();<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(jht.sayHello());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><div>Compile and execute.</div><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/aaxron/aggbug/217013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2019-12-06 10:50 <a href="http://www.cppblog.com/aaxron/archive/2019/12/06/217013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle分页</title><link>http://www.cppblog.com/aaxron/archive/2019/08/15/216694.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 15 Aug 2019 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2019/08/15/216694.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/216694.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2019/08/15/216694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/216694.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/216694.html</trackback:ping><description><![CDATA[<div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Oracle分页<br /><br />查询语句:<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">FROM</span>&nbsp;A_WECHAT&nbsp;<span style="color: #0000FF; ">WHERE</span>&nbsp;<span style="color: #800000; font-weight: bold; ">1</span><span style="color: #808080; ">=</span><span style="color: #800000; font-weight: bold; ">1</span><br /><br />查询记录总数:<br /><span style="color: #0000FF; ">SELECT</span>&nbsp;nvl(<span style="color: #FF00FF; ">count</span>(<span style="color: #808080; ">*</span>),<span style="color: #800000; font-weight: bold; ">0</span>)&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;totalNum&nbsp;<br /><span style="color: #0000FF; ">FROM</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">FROM</span>&nbsp;A_WECHAT&nbsp;<span style="color: #0000FF; ">WHERE</span>&nbsp;<span style="color: #800000; font-weight: bold; ">1</span><span style="color: #808080; ">=</span><span style="color: #800000; font-weight: bold; ">1</span><br />)&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;<span style="color: #800000; font-weight: bold; ">1</span><span style="color: #808080; ">=</span><span style="color: #800000; font-weight: bold; ">1</span><br /><br /><br />分页:<br /><br />&nbsp;<span style="color: #0000FF; ">SELECT</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">*</span>&nbsp;<br /><span style="color: #0000FF; ">FROM</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">SELECT</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIN.<span style="color: #808080; ">*</span>,&nbsp;ROWNUM&nbsp;<span style="color: #0000FF; ">AS</span>&nbsp;rowno&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">FROM</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">FROM</span>&nbsp;A_WECHAT&nbsp;<span style="color: #0000FF; ">WHERE</span>&nbsp;<span style="color: #800000; font-weight: bold; ">1</span><span style="color: #808080; ">=</span><span style="color: #800000; font-weight: bold; ">1</span>&nbsp;<span style="color: #0000FF; ">order</span>&nbsp;<span style="color: #0000FF; ">by</span>&nbsp;OPENID&nbsp;<span style="color: #0000FF; ">desc</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;TIN&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">WHERE</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROWNUM&nbsp;<span style="color: #808080; ">&lt;=</span>&nbsp;<span style="color: #800000; font-weight: bold; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;TOUT&nbsp;<br /><span style="color: #0000FF; ">WHERE</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;TOUT.rowno&nbsp;<span style="color: #808080; ">&gt;=</span>&nbsp;<span style="color: #800000; font-weight: bold; ">1</span>&nbsp;</div></div></div><img src ="http://www.cppblog.com/aaxron/aggbug/216694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2019-08-15 16:32 <a href="http://www.cppblog.com/aaxron/archive/2019/08/15/216694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#条件编译</title><link>http://www.cppblog.com/aaxron/archive/2019/06/26/216462.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 26 Jun 2019 10:03:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2019/06/26/216462.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/216462.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2019/06/26/216462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/216462.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/216462.html</trackback:ping><description><![CDATA[<div>&nbsp;Conditional compilation symbols</div><div></div><div>编译器命令行选项（例如，/define:DEBUG）,</div><div>&nbsp; &nbsp; 可以在VS2008的IDE进行设置, Project Property---&gt;Build---&gt;Conditional compilation symbols(如果多个科研使用逗号隔开)</div><div>&nbsp; &nbsp; 系统默认设置了:DEBUG 和 TRACE</div><div></div><div>操作系统外壳程序中的环境变量（例如，set DEBUG=1）。</div><div></div><div>源代码中的杂注（例如，用于定义编译变量的 #define DEBUG，以及用于取消定义它的 #undef DEBUG）。</div><div>&nbsp; &nbsp; &nbsp;必须在file的最前方设置,#define debug或者组合操作</div><div>&nbsp; &nbsp; #if (Debug &amp;&amp; Trace)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; #define DebugAndTrace&nbsp;</div><div>&nbsp; &nbsp; #endif</div><div></div><div>ps:Conditional位于using System.Diagnostics;</div><div></div><div>什么情况下使用该标识符?</div><div></div><div>当程序中一个方法或属性不想再使用时,如果把它删掉就需要把引用的地方一个一个全部删掉不然就会编译错误,这时我们就可以在塔的上面加一个[Conditional("string")] 然后程序运行时就会忽略它</div><div></div><div>ps:[Conditional("string")]里面字符串随意取&nbsp;&nbsp;</div><div></div><div>如果想再次调用那个方法或属性怎么办?</div><div></div><div>这个很简单,你只需在引用命名空间那个地方进行一个宏定义把你在[Conditional("string")]里面的字符串定义出来就能用了</div><div></div><div></div><div>C#-#define条件编译</div><div>C#的预处理器指令从来不会转化为可执行代码的命令，但是会影响编译过程的各个方面，常用的预处理器指令有#define、#undef、#if,#elif,#else和#endif等等，下面介绍C#中使用#define进行条件编译的实例。</div><div>C#中条件编译指令用于按条件包含或排除源文件中的某些部分。在Visual Studio中，会看到被排除的代码显示为灰色。</div><div></div><div>一、#define可以用来做什么</div><div></div><div>1、当计划发布两个版本的代码的时候。即基本版和拥有更多版本的企业版，就可以用到条件编译指令；</div><div>2、例如同一个文件给silverlight、wpf、winform等使用，并且还考虑Debug和Release等，有大部分代码是一样的；</div><div>3、指定函数和属性是否编译到最终产品中去。</div><div></div><div>二、#define用法</div><div></div><div>语法：#define 名称</div><div></div><div>注意：这里名称取Debug，你也可以取其他名称如Dragon</div><div></div><div>1 #define Debug</div><div>说明：</div><div></div><div>1、Debug可以看做是声明的一个变量，但此变量没有真正的值，存在时#if Debug结果为true，否则为false；</div><div></div><div>2、#define单独用没什么意义，一般是和#if或者Conditional特性结合使用；</div><div></div><div>3、#define必须定义在所有using命名空间前面；</div><div></div><div>4、Debug与DEBUG是不同的，C#区分大小写</div><div></div><div>&nbsp;</div><img src ="http://www.cppblog.com/aaxron/aggbug/216462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2019-06-26 18:03 <a href="http://www.cppblog.com/aaxron/archive/2019/06/26/216462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 官方下载地址（Spring Framework 3.2.x&amp;Spring Framework 4.0.x）</title><link>http://www.cppblog.com/aaxron/archive/2019/02/12/216238.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 12 Feb 2019 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2019/02/12/216238.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/216238.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2019/02/12/216238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/216238.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/216238.html</trackback:ping><description><![CDATA[<p>spring 官方下载地址（Spring Framework 3.2.x&amp;Spring Framework 4.0.x）<br />2017年02月24日 15:53:59 </p>
<p>SPRING官方网站改版后，建议都是通过 Maven和Gradle下载，对不使用Maven和Gradle开发项目的，下载就非常麻烦，下给出Spring Framework jar官方直接下载路径:</p>
<p><a href="http://repo.spring.io/libs-release-local/org/springframework/spring/">http://repo.spring.io/libs-release-local/org/springframework/spring/</a></p>
<p>&nbsp;</p>
<p>spring 4.0.x(Spring Framework 4.0.5)下载</p>
<p><a href="http://repo.spring.io/libs-release-local/org/springframework/spring/4.0.5.RELEASE/spring-framework-4.0.5.RELEASE-dist.zip">http://repo.spring.io/libs-release-local/org/springframework/spring/4.0.5.RELEASE/spring-framework-4.0.5.RELEASE-dist.zip</a></p>
<p>&nbsp;</p>
<p>spring 3.2.x（Spring Framework 3.2.9）下载：</p>
<p><a href="http://repo.spring.io/libs-release-local/org/springframework/spring/3.2.9.RELEASE/spring-framework-3.2.9.RELEASE-dist.zip">http://repo.spring.io/libs-release-local/org/springframework/spring/3.2.9.RELEASE/spring-framework-3.2.9.RELEASE-dist.zip</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>spring 3.2.x（Spring Framework 3.2.4）下载：</p>
<p><a href="http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.4.RELEASE/spring-framework-3.2.4.RELEASE-dist.zip">http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.4.RELEASE/spring-framework-3.2.4.RELEASE-dist.zip</a></p>
<p><br />&nbsp;</p>
<p>另spring security下载路径：</p>
<p><a href="http://repo.spring.io/libs-release-local/org/springframework/security/spring-security/">http://repo.spring.io/libs-release-local/org/springframework/security/spring-security/</a></p>
<p><a href="http://repo.spring.io/libs-release-local/org/springframework/security/spring-security/3.2.4.RELEASE/spring-security-3.2.4.RELEASE-dist.zip">http://repo.spring.io/libs-release-local/org/springframework/security/spring-security/3.2.4.RELEASE/spring-security-3.2.4.RELEASE-dist.zip</a></p><img src ="http://www.cppblog.com/aaxron/aggbug/216238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2019-02-12 11:44 <a href="http://www.cppblog.com/aaxron/archive/2019/02/12/216238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring源码分析（2）AnnotationMethodHandlerAdapter</title><link>http://www.cppblog.com/aaxron/archive/2018/04/11/215585.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 11 Apr 2018 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2018/04/11/215585.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/215585.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2018/04/11/215585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/215585.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/215585.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AnnotationMethodHandlerAdapter&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;WebContentGenerator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;HandlerAdapter,&nbsp;Ordered,&nbsp;BeanFactoryAware&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ModelAndView&nbsp;handle(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response,&nbsp;Object&nbsp;handler)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;invokeHandlerMethod(request,&nbsp;response,&nbsp;handler);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;ModelAndView&nbsp;invokeHandlerMethod(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response,&nbsp;Object&nbsp;handler)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletHandlerMethodResolver&nbsp;methodResolver&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getMethodResolver(handler);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;handlerMethod&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;methodResolver.resolveHandlerMethod(request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletHandlerMethodInvoker&nbsp;methodInvoker&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ServletHandlerMethodInvoker(methodResolver);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletWebRequest&nbsp;webRequest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ServletWebRequest(request,&nbsp;response);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExtendedModelMap&nbsp;implicitModel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BindingAwareModelMap();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;methodInvoker.invokeHandlerMethod(handlerMethod,&nbsp;handler,&nbsp;webRequest,&nbsp;implicitModel);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ModelAndView&nbsp;mav&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvoker.getModelAndView(handlerMethod,&nbsp;handler.getClass(),&nbsp;result,&nbsp;implicitModel,&nbsp;webRequest);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvoker.updateModelAttributes(handler,&nbsp;(mav&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;mav.getModel()&nbsp;:&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">),&nbsp;implicitModel,&nbsp;webRequest);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;mav;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ModelAndView&nbsp;getModelAndView(Method&nbsp;handlerMethod,&nbsp;Class</span><span style="color: #000000">&lt;?&gt;</span><span style="color: #000000">&nbsp;handlerType,&nbsp;Object&nbsp;returnValue,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExtendedModelMap&nbsp;implicitModel,&nbsp;ServletWebRequest&nbsp;webRequest)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;{}<br />}<br /></span></div><br /><br />其他
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Method&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Executable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;invoke(Object&nbsp;obj,&nbsp;Object<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IllegalAccessException,&nbsp;IllegalArgumentException,InvocationTargetException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">override)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">Reflection.quickCheckMemberAccess(clazz,&nbsp;modifiers))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class</span><span style="color: #000000">&lt;?&gt;</span><span style="color: #000000">&nbsp;caller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Reflection.getCallerClass();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkAccess(caller,&nbsp;clazz,&nbsp;obj,&nbsp;modifiers);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodAccessor&nbsp;ma&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;methodAccessor;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;read&nbsp;volatile</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ma&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ma&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;acquireMethodAccessor();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ma.invoke(obj,&nbsp;args);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ModelMap&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;LinkedHashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{}<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AbstractView&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;WebApplicationObjectSupport&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;View,&nbsp;BeanNameAware&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Prepares&nbsp;the&nbsp;view&nbsp;given&nbsp;the&nbsp;specified&nbsp;model,&nbsp;merging&nbsp;it&nbsp;with&nbsp;static<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;attributes&nbsp;and&nbsp;a&nbsp;RequestContext&nbsp;attribute,&nbsp;if&nbsp;necessary.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Delegates&nbsp;to&nbsp;renderMergedOutputModel&nbsp;for&nbsp;the&nbsp;actual&nbsp;rendering.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@see</span><span style="color: #008000">&nbsp;#renderMergedOutputModel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;render(Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;</span><span style="color: #000000">?&gt;</span><span style="color: #000000">&nbsp;model,&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(logger.isTraceEnabled())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.trace(</span><span style="color: #000000">"</span><span style="color: #000000">Rendering&nbsp;view&nbsp;with&nbsp;name&nbsp;'</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.beanName&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">'&nbsp;with&nbsp;model&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;model&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;and&nbsp;static&nbsp;attributes&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.staticAttributes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;mergedModel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;createMergedOutputModel(model,&nbsp;request,&nbsp;response);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepareResponse(request,&nbsp;response);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderMergedOutputModel(mergedModel,&nbsp;getRequestToExpose(request),&nbsp;response);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>代码：<br /><img src ="http://www.cppblog.com/aaxron/aggbug/215585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2018-04-11 16:40 <a href="http://www.cppblog.com/aaxron/archive/2018/04/11/215585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>