<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>One Piece of Programming</title>
    <description></description>
    <link>http://fakechris.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>windbg 备忘录 - 5</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/234892" style="color:red;">http://fakechris.javaeye.com/blog/234892</a>&nbsp;
          发表时间: 2008年08月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>k 堆栈</p>
<pre name="code" class="java">0:000&gt; k
ChildEBP RetAddr  
0012fb1c 7c95e612 ntdll!DbgBreakPoint
0012fc94 7c94108f ntdll!LdrpInitializeProcess+0xffa
0012fd1c 7c92e437 ntdll!_LdrpInitialize+0x183
00000000 00000000 ntdll!KiUserApcDispatcher+0x7</pre>
<p>&nbsp;</p>
<p>ln&nbsp; 查找最近的函数---手工遍历stack frame</p>
<pre name="code" class="java">0:000&gt; r eip
eip=7c92120e
0:000&gt; ln eip
(7c92120e)   ntdll!DbgBreakPoint   |  (7c921212)   ntdll!DbgUserBreakPoint</pre>
<pre name="code" class="java">0:000&gt; dd ebp+4 l4
0012fc98  7c94108f 0012fd30 7c920000 0012fce0</pre>
<pre name="code" class="java"> 0:000&gt; dd ebp l1
0012fc94  0012fd1c
0:000&gt; dd 0012fd1c+4 l4
0012fd20  7c92e437 0012fd30 7c920000 00000000
0:000&gt; ln 7c92e437
(7c92e430)   ntdll!KiUserApcDispatcher+0x7   |  (7c92e440)   ntdll!KiUserCallbackDispatcher
</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/234892#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 30 Aug 2008 23:21:47 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/234892</link>
        <guid>http://fakechris.javaeye.com/blog/234892</guid>
      </item>
      <item>
        <title>windbg 备忘录 - 4</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/214708" style="color:red;">http://fakechris.javaeye.com/blog/214708</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
<li>u</li>
</ul>
<pre name="code" class="java">0:000&gt; u 71a00212
71a00212 0000            add     byte ptr [eax],al
71a00214 003e            add     byte ptr [esi],bh
71a00216 0000            add     byte ptr [eax],al
</pre>
<ul>
<li>x</li>
</ul>
<pre name="code" class="java">0:020&gt; x ntdll!zw*
7c92d379 ntdll!ZwAcceptConnectPort (&lt;no parameter info&gt;)
7c92d38e ntdll!ZwAccessCheck (&lt;no parameter info&gt;)
7c92d3a3 ntdll!ZwAccessCheckAndAuditAlarm (&lt;no parameter info&gt;)</pre>
<ul>
<li>dds 查找二进制地址的符号<br />
</li>
</ul>
<pre name="code" class="java">0:000&gt; dds ebp
0012e738  0012e794
0012e73c  77d195f9 USER32!GetLastInputInfo+0x105
0012e740  00000002
0012e744  0012e760
</pre>
&nbsp;
<ul>
<li>dds显示COM c++虚函数表</li>
</ul>
<p>&nbsp;</p>
<pre name="code" class="java">0:020&gt; x ole32!OpaqueDataInfo::`vftable'
769a696c ole32!OpaqueDataInfo::`vftable' = &lt;no type information&gt;
769a6990 ole32!OpaqueDataInfo::`vftable' = &lt;no type information&gt;
0:020&gt; dds 769a696c
769a696c  76aa4d85 ole32!ServerLocationInfo::QueryInterface
769a6970  76aa4d94 ole32!SpecialProperties::AddRef
769a6974  76aa4da3 ole32!ServerLocationInfo::Release
769a6978  76aa6186 ole32!OpaqueDataInfo::Serialize
769a697c  76aa619d ole32!OpaqueDataInfo::UnSerialize
769a6980  76aa61da ole32!OpaqueDataInfo::GetSize
769a6984  76aa622b ole32!OpaqueDataInfo::GetCLSID
769a6988  76aa624b ole32!OpaqueDataInfo::SetParent
769a698c  76aa6278 ole32!OpaqueDataInfo::SerializableQueryInterface
769a6990  76aa62f3 ole32!ScmReplyInfo::QueryInterface
769a6994  769cc09b ole32!InstanceInfo::AddRef
769a6998  769cbfd3 ole32!ServerLocationInfo::Release
769a699c  76aa602d ole32!OpaqueDataInfo::AddOpaqueData
769a69a0  76aa60a3 ole32!OpaqueDataInfo::GetOpaqueData
769a69a4  76aa60f9 ole32!OpaqueDataInfo::DeleteOpaqueData
769a69a8  769dbcde ole32!ScmRequestInfo::GetScmInfo
769a69ac  769ddeac ole32!ServerLocationInfo::GetApartment
769a69b0  76a42304 ole32!CDdeObject::COleObjectImpl::GetExtent
769a69b4  00000021
769a69b8  76a2d24b ole32!CClassMoniker::QueryInterface
769a69bc  76a33503 ole32!CErrorObject::AddRef
769a69c0  76a06762 ole32!CClassMoniker::Release
769a69c4  76a06a01 ole32!CClassMoniker::GetUnmarshalClass
769a69c8  76a06a1e ole32!CClassMoniker::GetMarshalSizeMax
769a69cc  76a06a61 ole32!CClassMoniker::MarshalInterface
769a69d0  76a2cdd1 ole32!CClassMoniker::UnmarshalInterface
769a69d4  76a07061 ole32!CClassMoniker::ReleaseMarshalData
769a69d8  769e2be8 ole32!CMonikerFactory::LockServer
769a69dc  76a2d23c ole32!CClassMoniker::QueryInterface
769a69e0  76a334e5 ole32!CErrorObject::AddRef
769a69e4  76a06a80 ole32!CClassMoniker::Release
769a69e8  76a06999 ole32!CClassMoniker::GetComparisonData
</pre>
&nbsp;
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/214708#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 20:55:18 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/214708</link>
        <guid>http://fakechris.javaeye.com/blog/214708</guid>
      </item>
      <item>
        <title>windbg 备忘录 - 3</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/214397" style="color:red;">http://fakechris.javaeye.com/blog/214397</a>&nbsp;
          发表时间: 2008年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
<li>!runaway</li>
</ul>
<pre name="code" class="java">0:029&gt; !runaway
 User Mode Time
  Thread       Time
   6:358       0 days 0:00:01.640
   9:1358      0 days 0:00:00.343
   0:15f4      0 days 0:00:00.187
  25:5fc       0 days 0:00:00.046
  22:1200      0 days 0:00:00.046
  20:698       0 days 0:00:00.046
  21:17f4      0 days 0:00:00.031
  18:1524      0 days 0:00:00.031</pre>
<ul>
<li>~</li>
</ul>
<pre name="code" class="java">0:029&gt; ~
   0  Id: 109c.15f4 Suspend: 1 Teb: 7ffdf000 Unfrozen
   1  Id: 109c.103c Suspend: 1 Teb: 7ff96000 Unfrozen
   2  Id: 109c.db4 Suspend: 1 Teb: 7ffdd000 Unfrozen
0:029&gt; ~0s
eax=0012df98 ebx=0012e6c4 ecx=00000001 edx=7c92eb94 esi=00000000 edi=7ffd8000
eip=7c92eb94 esp=0012e69c ebp=0012e738 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
7c92eb94 c3              ret
0:000&gt; ~1
   1  Id: 109c.103c Suspend: 1 Teb: 7ff96000 Unfrozen
      Start: 000afce7
      Priority: 0  Priority class: 32  Affinity: 3
0:000&gt; ~1s
eax=77e56bf9 ebx=00000000 ecx=046efac8 edx=00000035 esi=0016c3b8 edi=00000100
eip=7c92eb94 esp=0807fe1c ebp=0807ff80 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
7c92eb94 c3              ret</pre>
<ul>
<li>kv</li>
</ul>
<pre name="code" class="java">0:001&gt; kv
ChildEBP RetAddr  Args to Child              
0807fe18 7c92e399 77e56713 0000037c 0807ff70 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0807fe1c 77e56713 0000037c 0807ff70 00000000 ntdll!NtReplyWaitReceivePortEx+0xc (FPO: [5,0,0])
0807ff80 77e56c2b 0807ffa8 77e56a4d 0016c3b8 RPCRT4!LRPC_ADDRESS::ReceiveLotsaCalls+0xf4 (FPO: [Non-Fpo])
0807ff88 77e56a4d 0016c3b8 00207f30 06c50a38 RPCRT4!RecvLotsaCallsWrapper+0xd (FPO: [Non-Fpo])
0807ffa8 77e56c13 0014d410 0807ffec 7c80b683 RPCRT4!BaseCachedThreadRoutine+0x79 (FPO: [Non-Fpo])
0807ffb4 7c80b683 06d43988 00207f30 06c50a38 RPCRT4!ThreadStartRoutine+0x1a (FPO: [Non-Fpo])
0807ffec 00000000 77e56bf9 06d43988 00000000 kernel32!BaseThreadStart+0x37 (FPO: [Non-Fpo])
</pre>
<ul>
<li>~*k</li>
</ul>
<p>&nbsp;</p>
<pre name="code" class="java">0:001&gt; ~*k

   0  Id: 109c.15f4 Suspend: 1 Teb: 7ffdf000 Unfrozen
ChildEBP RetAddr  
0012e698 7c92e9ab ntdll!KiFastSystemCallRet
0012e69c 7c8094e2 ntdll!ZwWaitForMultipleObjects+0xc
0012e738 77d195f9 kernel32!WaitForMultipleObjectsEx+0x12c
0012e794 5dff6029 USER32!RealMsgWaitForMultipleObjectsEx+0x13e
0012e7b4 5dff632d IEUI!CoreSC::Wait+0x49
0012e7dc 5dff60d8 IEUI!CoreSC::WaitMessage+0x54
0012e7e8 423698bd IEUI!WaitMessageEx+0x33
0012e818 4235ab4c IEFRAME!CBrowserFrame::FrameMessagePump+0x199
0012e824 4235bbbb IEFRAME!BrowserThreadProc+0x3f
0012e848 4235bb09 IEFRAME!BrowserNewThreadProc+0x7b
0012f8b8 4235b9b9 IEFRAME!SHOpenFolderWindow+0x188
0012fae8 0040147c IEFRAME!IEWinMain+0x2d9
0012ff2c 00401317 iexplore!wWinMain+0x2c1
0012ffc0 7c816fd7 iexplore!_initterm_e+0x1b1
0012fff0 00000000 kernel32!BaseProcessStart+0x23

   1  Id: 109c.103c Suspend: 1 Teb: 7ff96000 Unfrozen
ChildEBP RetAddr  
0807fe18 7c92e399 ntdll!KiFastSystemCallRet
0807fe1c 77e56713 ntdll!NtReplyWaitReceivePortEx+0xc
0807ff80 77e56c2b RPCRT4!LRPC_ADDRESS::ReceiveLotsaCalls+0xf4
0807ff88 77e56a4d RPCRT4!RecvLotsaCallsWrapper+0xd
0807ffa8 77e56c13 RPCRT4!BaseCachedThreadRoutine+0x79
0807ffb4 7c80b683 RPCRT4!ThreadStartRoutine+0x1a
0807ffec 00000000 kernel32!BaseThreadStart+0x37

   2  Id: 109c.db4 Suspend: 1 Teb: 7ffdd000 Unfrozen
ChildEBP RetAddr  
0117ff20 7c92e9c0 ntdll!KiFastSystemCallRet
0117ff24 7c8025cb ntdll!ZwWaitForSingleObject+0xc
0117ff88 7c802532 kernel32!WaitForSingleObjectEx+0xa8
0117ff9c 00ed4d4e kernel32!WaitForSingleObject+0x12
WARNING: Stack unwind information not available. Following frames may be wrong.
0117ffec 00000000 GOOGLEPINYIN!ImeSettingsManage+0x16f7e

   3  Id: 109c.de4 Suspend: 1 Teb: 7ffdc000 Unfrozen
ChildEBP RetAddr  
036dfdbc 7c92e9ab ntdll!KiFastSystemCallRet
036dfdc0 7c8094e2 ntdll!ZwWaitForMultipleObjects+0xc
036dfe5c 77d195f9 kernel32!WaitForMultipleObjectsEx+0x12c
036dfeb8 5dff6029 USER32!RealMsgWaitForMultipleObjectsEx+0x13e
036dfed8 5dff93e4 IEUI!CoreSC::Wait+0x49
036dff0c 5dff98a6 IEUI!CoreSC::xwProcessNL+0xa4
036dff2c 5dff9806 IEUI!GetMessageExA+0x44
036dff80 77c0a3b0 IEUI!ResourceManager::SharedThreadProc+0xb6
036dffb4 7c80b683 msvcrt!_endthreadex+0xa9
036dffec 00000000 kernel32!BaseThreadStart+0x37
</pre>
&nbsp;
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/214397#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jul 2008 21:58:44 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/214397</link>
        <guid>http://fakechris.javaeye.com/blog/214397</guid>
      </item>
      <item>
        <title>windbg 备忘录 - 2</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/214396" style="color:red;">http://fakechris.javaeye.com/blog/214396</a>&nbsp;
          发表时间: 2008年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
<li>vertarget</li>
</ul>
<p>&nbsp;</p>
<pre name="code" class="java">0:020&gt; vertarget
Windows XP Version 2600 (Service Pack 2) MP (2 procs) Free x86 compatible
Product: WinNt, suite: SingleUserTS
kernel32.dll version: 
Debug session time: Sun Jul 13 17:04:47.593 2008 (GMT+8)
System Uptime: 0 days 7:25:03.283
Process Uptime: 0 days 0:00:40.156
  Kernel time: 0 days 0:00:01.015
  User time: 0 days 0:00:00.531
</pre>
<p>&nbsp;</p>
<ul>
<li>!peb</li>
</ul>
<p>&nbsp;</p>
<pre name="code" class="java">0:020&gt; !peb
PEB at 7ffd8000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            Yes
    ImageBaseAddress:         00400000
    Ldr                       00241e90
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 00241f28 . 00247840
    Ldr.InLoadOrderModuleList:           00241ec0 . 00247830
    Ldr.InMemoryOrderModuleList:         00241ec8 . 00247838
            Base TimeStamp                     Module
          400000 48057626 Apr 16 11:44:38 2008 C:\Program Files\Internet Explorer\iexplore.exe
        7c920000 411095a0 Aug 04 15:52:00 2004 C:\WINDOWS\system32\ntdll.dll
</pre>
&nbsp;
<ul>
<li>lmvm</li>
</ul>
<pre name="code" class="java">0:020&gt; lmvm msvcrt
start    end        module name
77be0000 77c38000   msvcrt     (pdb symbols)          C:\symserver\msvcrt.pdb\A678F3C30DED426B839032B996987E381\msvcrt.pdb
    Loaded symbol image file: C:\WINDOWS\system32\msvcrt.dll
    Image path: C:\WINDOWS\system32\msvcrt.dll
    Image name: msvcrt.dll
    Timestamp:        Wed Aug 04 15:54:19 2004 (4110962B)
    CheckSum:         0005B1BC
    ImageSize:        00058000
    File version:     7.0.2600.2180
    Product version:  6.1.8638.2180
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        1.0 App
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Windows® Operating System
    InternalName:     msvcrt.dll
    OriginalFilename: msvcrt.dll
    ProductVersion:   7.0.2600.2180
    FileVersion:      7.0.2600.2180 (xpsp_sp2_rtm.040803-2158)
    FileDescription:  Windows NT CRT DLL
    LegalCopyright:   © Microsoft Corporation. All rights reserved.
</pre>
&nbsp;
<p>&nbsp;</p>
<ul>
<li>lm</li>
</ul>
<pre name="code" class="java">0:020&gt; lm
start    end        module name
00400000 0049b000   iexplore   (pdb symbols)          C:\symserver\iexplore.pdb\D30DD314266F4A0FB8DD6828D163AFDB2\iexplore.pdb
00eb0000 00f6a000   GOOGLEPINYIN C (export symbols)       C:\WINDOWS\system32\GOOGLEPINYIN.IME
</pre>
&nbsp;
<p>&nbsp;</p>
<ul>
<li>r dd dw db ed</li>
<li>s -u 0012ff40 L?80000000 &quot;haibao.cn&quot;</li>
</ul>
<pre name="code" class="java">0:029&gt; s -u 0012ff40 L?80000000 &quot;haibao.cn&quot;
0018d982  0068 0061 0069 0062 0061 006f 002e 0063  h.a.i.b.a.o...c.
00190656  0068 0061 0069 0062 0061 006f 002e 0063  h.a.i.b.a.o...c.
0019c478  0068 0061 0069 0062 0061 006f 002e 0063  h.a.i.b.a.o...c.
0019c498  0068 0061 0069 0062 0061 006f 002e 0063  h.a.i.b.a.o...c.
0019c598  0068 0061 0069 0062 0061 006f 002e 0063  h.a.i.b.a.o...c.
0019c5f8  0068 0061 0069 0062 0061 006f 002e 0063  h.a.i.b.a.o...c.</pre>
&nbsp;
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/214396#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jul 2008 21:53:01 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/214396</link>
        <guid>http://fakechris.javaeye.com/blog/214396</guid>
      </item>
      <item>
        <title>windbg 备忘录 - 1</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/214366" style="color:red;">http://fakechris.javaeye.com/blog/214366</a>&nbsp;
          发表时间: 2008年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
<li>x 搜索函数</li>
</ul>
<p>&nbsp;</p>
<pre name="code" class="c">0:000&gt; x windbgtest!change
00411400 windbgtest!change (char *)
0:000&gt; x windbgtest!getB
004113c0 windbgtest!getB (void)
</pre>
&nbsp;
<ul>
<li>bp 加断点</li>
</ul>
<p>&nbsp;</p>
<pre name="code" class="c">0:000&gt; bp 4113c0
0:000&gt; bp 411400
</pre>
&nbsp;
<ul>
<li>bl list断点<br />
bc 清除断点</li>
</ul>
<pre name="code" class="c">0:000&gt; bl
 0 e 004113c0 [e:\temp\windbgtest\windbgtest\windbgtest.cpp @ 8]    0001 (0001)  0:**** windbgtest!getB
 1 e 00411400 [e:\temp\windbgtest\windbgtest\windbgtest.cpp @ 13]    0001 (0001)  0:**** windbgtest!change
0:000&gt; bc 0
</pre>
<p>&nbsp;</p>
<ul>
<li>k 显示堆栈</li>
</ul>
<p>&nbsp;</p>
<pre name="code" class="c">0:000&gt; k
ChildEBP RetAddr  
0012fe88 004114ae windbgtest!getB [e:\temp\windbgtest\windbgtest\windbgtest.cpp @ 8]
0012ff68 00411a98 windbgtest!wmain+0x4e [e:\temp\windbgtest\windbgtest\windbgtest.cpp @ 26]
0012ffb8 004118df windbgtest!__tmainCRTStartup+0x1a8 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 579]
0012ffc0 7c816fd7 windbgtest!wmainCRTStartup+0xf [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 399]
0012fff0 00000000 kernel32!BaseProcessStart+0x23
</pre>
&nbsp;
<ul>
<li>dc 显示内存数据</li>
</ul>
<pre name="code" class="c">0:000&gt; dc eax
00415741  70337033 25000000 25000073 6b000a73  3p3p...%s..%s..k
00415751  63207965 00746e6f 00000000 66000000  ey cont........f
</pre>
<p>&nbsp;</p>
<ul>
<li>address 显示内存属性</li>
</ul>
<p>&nbsp;</p>
<pre name="code" class="java">0:000&gt; !address eax
    00400000 : 00415000 - 00002000
                    Type     01000000 MEM_IMAGE
                    Protect  00000002 PAGE_READONLY
                    State    00001000 MEM_COMMIT
                    Usage    RegionUsageImage
                    FullPath windbgtest.exe
</pre>
&nbsp;
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/214366#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jul 2008 17:06:28 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/214366</link>
        <guid>http://fakechris.javaeye.com/blog/214366</guid>
      </item>
      <item>
        <title>Boost test code</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/200223" style="color:red;">http://fakechris.javaeye.com/blog/200223</a>&nbsp;
          发表时间: 2008年06月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="c++">
// clientcontrol.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include &lt;fstream>
#include &lt;iostream>

#include &lt;boost/filesystem.hpp>
#include &lt;boost/program_options.hpp>
#define BOOST_LOG_DONOT_USE_WCHAR_T
#include &lt;boost/logging/format_fwd.hpp>
#include &lt;boost/logging/format.hpp>

using namespace std;

using namespace boost::logging;
namespace po = boost::program_options;
using namespace boost::filesystem;


BOOST_LOG_FORMAT_MSG( optimize::cache_string_one_str&lt;> )

typedef logger_format_write&lt; > log_type;

// Step 4: declare which filters and loggers you'll use (usually in a header file)
BOOST_DECLARE_LOG_FILTER(g_log_filter, filter::no_ts ) 
BOOST_DECLARE_LOG(g_l, log_type) 

#define L_ BOOST_LOG_USE_LOG_IF_FILTER(g_l(), g_log_filter()->is_enabled() ) 

BOOST_DEFINE_LOG_FILTER(g_log_filter, filter::no_ts ) 
BOOST_DEFINE_LOG(g_l, log_type) 


int _tmain(int argc, _TCHAR* argv[])
{
	int opt;

	g_l()->writer().add_formatter( formatter::idx(), "[%] " );
	g_l()->writer().add_formatter( formatter::append_newline() );
	g_l()->writer().add_destination( destination::cout() );
	g_l()->writer().add_destination( destination::dbg_window() );
	g_l()->writer().add_destination( destination::file("server.log"));
	//g_l()->writer().add_destination( dest_out );
	g_l()->mark_as_initialized();

	L_ &lt;&lt; "test" &lt;&lt; 12;

	// Declare a group of options that will be 
	// allowed only on command line
	po::options_description generic("Generic options");
	generic.add_options()
		("version,v", "print version string")
		("help", "produce help message")    
		;

	// Declare a group of options that will be 
	// allowed both on command line and in
	// config file
	po::options_description config("Configuration");
	config.add_options()
		("optimization", po::value&lt;int>(&opt)->default_value(10), 
		"optimization level")
		("include-path,I", 
		po::value&lt; vector&lt;string> >()->composing(), 
		"include path")
		;

	// Hidden options, will be allowed both on command line and
	// in config file, but will not be shown to the user.
	po::options_description hidden("Hidden options");
	hidden.add_options()
		("input-file", po::value&lt; vector&lt;string> >(), "input file")
		;      

	po::options_description cmdline_options;
	cmdline_options.add(generic).add(config).add(hidden);

	po::options_description config_file_options;
	config_file_options.add(config).add(hidden);

	po::options_description visible("Allowed options");
	visible.add(generic).add(config);

	po::variables_map vm;
	po::store(po::parse_command_line(argc, argv, cmdline_options), vm);
	ifstream ifs("test.cfg");
	po::store(po::parse_config_file(ifs, config_file_options), vm);
	po::notify(vm);   

	if (vm.count("help")) {
		cout &lt;&lt; cmdline_options &lt;&lt; "\n";
		return 1;
	}

	if (vm.count("optimization")) {
		cout &lt;&lt; "optimization level was set to " 
			&lt;&lt; vm["optimization"].as&lt;int>() &lt;&lt; ".\n";
	} 
	
	
	if (vm.count("include-path")) {
		cout &lt;&lt; "include-path level was set to " 
			&lt;&lt; vm["include-path"].as&lt; vector&lt;string> >()[0] &lt;&lt; ".\n";
		cout &lt;&lt; "include-path level was set to " 
			&lt;&lt; vm["include-path"].as&lt; vector&lt;string> >()[1] &lt;&lt; ".\n";
	} 

	create_directories("test/okla/zzc");
	copy_file("c:\\windows\\system32\\drivers\\etc\\hosts", "test/okla/zzc/hosts");
	//copy_file("c:\\windows\\system32\\drivers\\etc\\", "test/okla/zzc/");
	

	/*
	// Declare the supported options.
	po::options_description desc("Allowed options");
	desc.add_options()
		("help", "produce help message")
		("compression", po::value&lt;int>(), "set compression level")
		;

	po::variables_map vm;
	po::store(po::parse_command_line(argc, argv, desc), vm);
	po::notify(vm);    

	if (vm.count("help")) {
		cout &lt;&lt; desc &lt;&lt; "\n";
		return 1;
	}

	if (vm.count("compression")) {
		cout &lt;&lt; "Compression level was set to " 
			&lt;&lt; vm["compression"].as&lt;int>() &lt;&lt; ".\n";
	} else {
		cout &lt;&lt; "Compression level was not set.\n";
	}
	*/
	return 0;
}
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/200223#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jun 2008 18:16:59 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/200223</link>
        <guid>http://fakechris.javaeye.com/blog/200223</guid>
      </item>
      <item>
        <title>发布一个python的分词模块</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/163334" style="color:red;">http://fakechris.javaeye.com/blog/163334</a>&nbsp;
          发表时间: 2008年02月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://code.google.com/p/pychseg/" target="_blank">http://code.google.com/p/pychseg/</a><br /><br />第一个版本实现了基于的MMSEG中文分词算法Python 实现。MMSEG实际上是一个正向最大匹配+多个规则的分词算法。链接给出的几个网站写的很清楚了。在开发过程中我增加了一个规则来处理原来的算法中有可能出现的冲突问题。当所有的规则都无法唯一的确定一个chunk时，优先选择后面比较长的词。开发过程中参照了MMSEG的Java实现和ruby实现。并且对性能进行了初步的优化。<br /><br />目前的性能数据：在Pentium D 2.8G的CPU下处理2.9MB的文本数据，不开启pysco的情况下104s，开启pysco的情况下90s，能达到32KB/s。经测试速度能达到 Java版本MMSEG的1/3，未来如果要进一步优化速度的话应该是把关键的算法的实现移植到c语言中。<br /><br />TODO:<br /><br />    * 实现NLTK兼容的接口<br />    * C语言级别的优化<br />    * 实现其他算法，目前考虑一个ICTCLAS的python实现，要看有没有时间<br />    * 支持停用词，支持unicode的字母数字检测等 <br /><br />与分词有关的其他想法<br /><br />    * 研究一下ferret/cferret，能否实现一个python binding并且结合进去<br />    * 与nlp/datamining的进一步结合
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/163334#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Feb 2008 13:41:05 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/163334</link>
        <guid>http://fakechris.javaeye.com/blog/163334</guid>
      </item>
      <item>
        <title>Scala 用函数式编程的方法调用db4o</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/110998" style="color:red;">http://fakechris.javaeye.com/blog/110998</a>&nbsp;
          发表时间: 2007年08月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>db4o 是一个开源的纯面向对象数据库，同时支持Java和dotNet。使用db4o可以用更加面向对象的方式存储数据，比JPA等通过ORM来协调数据库和对象之间的方案来的更为自然。</p>
<p>那么用函数式编程的眼光来看，应该如何使用db4o这样的库呢？首先我们来看一个db4o的包装类</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span>package&nbsp;plan.util; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;com.db4o.query.Query &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>abstract&nbsp;class&nbsp;LazyQuery[QInterface,&nbsp;T]&nbsp; (val&nbsp;criteria:&nbsp;List[</span><span class="attribute">Query</span><span>=</span><span class="tag">&gt;</span><span>Query])&nbsp;extends&nbsp;Iterable[T]&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;</span><span class="attribute">elements</span><span>&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;init:&nbsp;</span><span class="attribute">Query</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">null</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; // 等价于 criteria leftFold init (&nbsp;query=&gt;query(query=&gt;query) )</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">query</span><span>&nbsp;=&nbsp;(criteria&nbsp;:\&nbsp;init)((f,&nbsp;q)=</span><span class="tag">&gt;</span><span>f(q)) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Db4oUtil.iterate[T](query) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;factory:&nbsp;List[</span><span class="attribute">Query</span><span>=</span><span class="tag">&gt;</span><span>Query]=</span><span class="tag">&gt;</span><span>QInterface &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;constrain(c:&nbsp;</span><span class="attribute">Query</span><span>=</span><span class="tag">&gt;</span><span>Query)&nbsp;=&nbsp;factory(c&nbsp;::&nbsp;criteria) &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>object&nbsp;Db4oUtil&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;iterate[T](q:&nbsp;Query)&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">set</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">q</span><span>.execute() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Iterator[T]&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span class="attribute">hasNext</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">set</span><span>.hasNext &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span class="attribute">next</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">set</span><span>.next.asInstanceOf[T] &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>看一个实际的例子，People和AutoInfo是POJO，People有一个指向AutoInfo的List。通过继承LazyQuery的Peoples可以很容易做一些查询、filter、以及复杂的操作。由于是functional的（所有的constrain都是query=&gt;query的函数），所以各个查询条件可以互相组合，非常方便</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span>package&nbsp;plan; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;plan.util.Db4oUtil &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;plan.util.LazyQuery &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.db4o.Db4o &nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;com.db4o.ObjectContainer &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.db4o.query.Query &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;scala.reflect.BeanProperty &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>class&nbsp;People&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;id:&nbsp;</span><span class="attribute">int</span><span>&nbsp;=</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;var&nbsp;name:&nbsp;</span><span class="attribute">String</span><span>&nbsp;=</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;address:&nbsp;</span><span class="attribute">String</span><span>&nbsp;=</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;var&nbsp;autoInfoList:&nbsp;</span><span class="attribute">java.util.List</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;java.util.ArrayList &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;addAutoInfo(autoInfo:&nbsp;AutoInfo)&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;autoInfoList.add(autoInfo) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;</span><span class="attribute">autoCount</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">autoInfoList</span><span>&nbsp;size &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>class&nbsp;AutoInfo&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;id:&nbsp;</span><span class="attribute">int</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">_</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;var&nbsp;name:&nbsp;</span><span class="attribute">String</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">_</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;owner:&nbsp;</span><span class="attribute">People</span><span>&nbsp;&nbsp;=&nbsp;</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>class&nbsp;Peoples(criteria:&nbsp;List[</span><span class="attribute">Query</span><span>=</span><span class="tag">&gt;</span><span>Query])&nbsp;extends&nbsp;LazyQuery[Peoples,&nbsp;People](criteria)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;override&nbsp;def&nbsp;</span><span class="attribute">factory</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;Peoples(_) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;withAuto()&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;constrain&nbsp;{&nbsp;</span><span class="attribute">q</span><span>=</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.descend(&quot;autoInfoList&quot;) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;def&nbsp;</span><span class="attribute">totalAuto</span><span>&nbsp;=&nbsp;(this.map(_.autoCount)&nbsp;:\&nbsp;0)(&nbsp;(f,g)&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;f&nbsp;+&nbsp;g&nbsp;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>object&nbsp;Db4oTest&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;db:&nbsp;</span><span class="attribute">ObjectContainer</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;initData()&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">peo</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;People &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">peo.address</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;北京&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">peo.name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;Chris&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span class="attribute">auInfo</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;AutoInfo &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">auInfo.name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;雪铁龙&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">auInfo.owner</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">peo</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;peo.addAutoInfo(auInfo)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;db.set(peo) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">peo1</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;People &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">peo1.address</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;上海&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">peo1.name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;Louis&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;db.set(peo1) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;private&nbsp;def&nbsp;query(klass:&nbsp;Class)&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">q</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">db</span><span>.query() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;q.constrain(klass) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;q &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;main(args:&nbsp;Array[String])&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">db</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">Db4o</span><span>.openFile(&quot;auto.yap&quot;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//initData&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">peoples</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;Peoples(List(</span><span class="attribute">q</span><span>=</span><span class="tag">&gt;</span><span>query(classOf[People]))) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;get&nbsp;total&nbsp;car&nbsp;all&nbsp;people&nbsp;have &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;peoples.totalAuto&nbsp;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;lazy&nbsp;query&nbsp;all&nbsp;people &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(peo&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">-</span><span>&nbsp;peoples.elements)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;peo.name&nbsp;)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;lazy&nbsp;query&nbsp;all&nbsp;people&nbsp;with&nbsp;autoinfo &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(peo&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">-</span><span>&nbsp;peoples.withAuto.elements)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;peo.name&nbsp;)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}finally{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.close(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/110998#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Aug 2007 22:53:08 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/110998</link>
        <guid>http://fakechris.javaeye.com/blog/110998</guid>
      </item>
      <item>
        <title>用gdb调试python程序</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/110967" style="color:red;">http://fakechris.javaeye.com/blog/110967</a>&nbsp;
          发表时间: 2007年08月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近遇到情况，一堆python进程中不定期的有一个内存会突然暴涨。由于重现几率非常低，而且无法分析原因，只好上gdb调试了。<br />
中间走了点弯路，python源代码自带了gdb的宏，但是pystack和pyo基本不能用。最后的办法就是当出现问题的时候，使用gdb attach到python程序上，然后在堆栈中找到PyFrameObject对象， 从而定位到出问题的python函数<br />
函数名 *(char*)&amp;(((PyStringObject*)f-&gt;f_code-&gt;co_name)-&gt;ob_sval)<br />
文件名  *(char*)&amp;(((PyStringObject*)f-&gt;f_code-&gt;co_filename)-&gt;ob_sval)<br />
行号 f-&gt;f_code-&gt;firstlineno<br />
<br />
不过在gdb中想要得到类和dict的信息真是太痛苦了，有空研究一下为什么pyo的宏不能使用
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/110967#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Aug 2007 18:31:00 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/110967</link>
        <guid>http://fakechris.javaeye.com/blog/110967</guid>
      </item>
      <item>
        <title>与python内存泄露作斗争</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/108963" style="color:red;">http://fakechris.javaeye.com/blog/108963</a>&nbsp;
          发表时间: 2007年08月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>偶们的网站是基于Django开发的，部署在lighttpd + fastcgi模式，最近遇到一个诡异的问题，不定期有一个或几个进程内存突然飙升至几百兆濒临崩溃。想了很多办法调试</p>
<p>1、gdb动态attach上去，结果python2.5的gdbinit文件的宏似乎不起作用</p>
<p>2、试图使用valgrind未果</p>
<p>3、在python上加signal handler，但是出错时无法响应handler函数</p>
<p>最后只好临时增加一个脚本，检测内存过高的python进程并且直接kill之，算是个临时方案吧</p>
<div class="code_title">sh&nbsp;代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-cpp">
    <li class="alt"><span><span>ps&nbsp;--no-headers&nbsp;-A&nbsp;-o&nbsp;</span><span class="string">&quot;vsz&nbsp;%cpu&nbsp;rss&nbsp;sz&nbsp;ucomm&nbsp;pid&quot;</span><span>&nbsp;|&nbsp;awk&nbsp;'$1&nbsp;&gt;&nbsp;80000&nbsp;&amp;&amp;&nbsp;$5&nbsp;==&nbsp;</span><span class="string">&quot;python&quot;</span><span>&nbsp;'{print&nbsp;$6}'&nbsp;|&nbsp;xargs&nbsp;kill&nbsp;-9&nbsp;&nbsp;</span></span></li>
</ol>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/108963#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 04 Aug 2007 22:23:56 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/108963</link>
        <guid>http://fakechris.javaeye.com/blog/108963</guid>
      </item>
      <item>
        <title>在scala里调用Hibernate JPA</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/108302" style="color:red;">http://fakechris.javaeye.com/blog/108302</a>&nbsp;
          发表时间: 2007年08月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>虽然scala里也能直接使用hibernate逆向工程生成的entity文件，但是使用scala可以大大减少代码量。</p>
<p>pojo在java中的定义如下</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="annotation">@Entity</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="annotation">@Table</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;mytable&quot;</span><span>,&nbsp;catalog&nbsp;=&nbsp;</span><span class="string">&quot;mydb&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyTable&nbsp;</span><span class="keyword">implements</span><span>&nbsp;java.io.Serializable&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;summary; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Date&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;tags; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;MyTable&nbsp;()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;MyTable&nbsp;(</span><span class="keyword">int</span><span>&nbsp;id,&nbsp;String&nbsp;title,&nbsp;Date&nbsp;date)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.title&nbsp;=&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;MyTable&nbsp;(</span><span class="keyword">int</span><span>&nbsp;id,&nbsp;String&nbsp;title,&nbsp;String&nbsp;summary,&nbsp;Date&nbsp;date, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tags)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.title&nbsp;=&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.summary&nbsp;=&nbsp;summary; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags&nbsp;=&nbsp;tags; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Id</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;id&quot;</span><span>,&nbsp;unique&nbsp;=&nbsp;</span><span class="keyword">true</span><span>,&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getId()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.id; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(</span><span class="keyword">int</span><span>&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;title&quot;</span><span>,&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,&nbsp;length&nbsp;=&nbsp;</span><span class="number">256</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getTitle()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.title; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setTitle(String&nbsp;title)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.title&nbsp;=&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;summary&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getSummary()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.summary; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setSummary(String&nbsp;summary)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.summary&nbsp;=&nbsp;summary; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Temporal</span><span>(TemporalType.DATE) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;date&quot;</span><span>,&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,&nbsp;length&nbsp;=&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Date&nbsp;getDate()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.date; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setDate(Date&nbsp;date)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;tags&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getTags()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.tags; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setTags(String&nbsp;tags)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags&nbsp;=&nbsp;tags; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>Scala由于有内置的BeanProperty支持，上面的代码缩减为下面的，一切setter/getter函数都免了，当然愿意手工加也可以</p>
<div class="code_title">scala&nbsp;代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="annotation">@Entity</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="annotation">@Table</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;mytable&quot;</span><span>,&nbsp;val&nbsp;catalog&nbsp;=&nbsp;</span><span class="string">&quot;mydb&quot;</span><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">class</span><span>&nbsp;MyTable&nbsp;</span><span class="keyword">extends</span><span>&nbsp;&nbsp;java.io.Serializable&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Id</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;id&quot;</span><span>,&nbsp;val&nbsp;unique&nbsp;=&nbsp;</span><span class="keyword">true</span><span>,&nbsp;val&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span class="annotation">@BeanProperty</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;id:&nbsp;</span><span class="keyword">int</span><span>&nbsp;=&nbsp;_ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;title&quot;</span><span>,&nbsp;val&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,&nbsp;val&nbsp;length&nbsp;=&nbsp;</span><span class="number">256</span><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@BeanProperty</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;title:&nbsp;String&nbsp;=&nbsp;_ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;summary&quot;</span><span>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@BeanProperty</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;summary:&nbsp;String&nbsp;=&nbsp;_ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Temporal</span><span>(TemporalType.DATE) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;date&quot;</span><span>,&nbsp;val&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,&nbsp;val&nbsp;length&nbsp;=&nbsp;</span><span class="number">0</span><span>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@BeanProperty</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;date:&nbsp;Date&nbsp;=&nbsp;_ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;tags&quot;</span><span>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@BeanProperty</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tags:&nbsp;String&nbsp;=&nbsp;_ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span class="keyword">this</span><span>(id:&nbsp;</span><span class="keyword">int</span><span>,&nbsp;title:&nbsp;String,&nbsp;date:&nbsp;Date)&nbsp;=&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.title&nbsp;=&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span class="keyword">this</span><span>(id:&nbsp;</span><span class="keyword">int</span><span>,&nbsp;title:&nbsp;String,&nbsp;summary:&nbsp;String,&nbsp;date:&nbsp;Date,&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tags:&nbsp;String)&nbsp;=&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.title&nbsp;=&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.summary&nbsp;=&nbsp;summary; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags&nbsp;=&nbsp;tags; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>访问也很简单</p>
<div class="code_title">scala 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>val&nbsp;emf&nbsp;=&nbsp;Persistence.createEntityManagerFactory(</span><span class="string">&quot;helloworld&quot;</span><span>) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>val&nbsp;em&nbsp;=&nbsp;emf.createEntityManager()&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>var&nbsp;tests&nbsp;=&nbsp;em.createQuery( &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;from&nbsp;MyTable&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;).getResultList() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//&nbsp;这里将java.util.List转换为scala的List，方便处理 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>val&nbsp;testsList&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;scala.collection.jcl.BufferWrapper[MyTable]&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override&nbsp;def&nbsp;underlying&nbsp;=&nbsp;tests&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">for</span><span>&nbsp;(test&nbsp;&lt; -&nbsp;testsList)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(test) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(test.title) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(test.summary) &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/108302#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 02 Aug 2007 23:09:00 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/108302</link>
        <guid>http://fakechris.javaeye.com/blog/108302</guid>
      </item>
      <item>
        <title>python的小工具，把hibernate reverse engine生成的java文件转换为scala的</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/107970" style="color:red;">http://fakechris.javaeye.com/blog/107970</a>&nbsp;
          发表时间: 2007年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近需要把hibernate reverse enginering生成的java entity代码转换为scala的（虽然scala能够直接调用java的代码）。Scala的语法虽然和java很相近，但是手工改起来还是很麻烦。</p>
<p>先是考察了antlr，不过由于hibernate生成的文件格式十分工整，用antlr似乎有点牛刀杀鸡的嫌疑。看了python antlr的文档，发现antlr3的语法变得厉害，而且对ast解析的tree parser也很复杂，不像是短时间内能搞定的，于是决定放弃lexer，裸写正则表达式处理，主要牵涉到annotation、构造函数以及函数定义的处理，大约2个多小时完工，这是代码。</p>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-py">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">os</span><span>,</span><span class="commonlibs">sys</span><span>,</span><span class="commonlibs">re</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">def</span><span>&nbsp;doFunction(*args): &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;arglist&nbsp;=&nbsp;args[3].split(&quot;,&quot;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;newargs&nbsp;=&nbsp;[] &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;arg&nbsp;</span><span class="keyword">in</span><span>&nbsp;arglist:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newargs.</span><span class="builtins">append</span><span>(&nbsp;</span><span class="commonlibs">re</span><span>.sub(&quot;(\S+)\s+(\S+)&quot;,&nbsp;r&quot;\2:&nbsp;\1&quot;,&nbsp;arg.strip())&nbsp;) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;newargstr&nbsp;=&nbsp;&quot;,&nbsp;&quot;.join(newargs)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;&quot;%sdef&nbsp;%s(%s)&nbsp;=&nbsp;%s\n&quot;&nbsp;%&nbsp;(args[0],&nbsp;args[2],&nbsp;newargstr,&nbsp;args[4]) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">def</span><span>&nbsp;doConstructor(*args): &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;arglist&nbsp;=&nbsp;args[2].split(&quot;,&quot;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;newargs&nbsp;=&nbsp;[] &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;arg&nbsp;</span><span class="keyword">in</span><span>&nbsp;arglist:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newargs.</span><span class="builtins">append</span><span>(&nbsp;</span><span class="commonlibs">re</span><span>.sub(&quot;(\S+)\s+(\S+)&quot;,&nbsp;r&quot;\2:&nbsp;\1&quot;,&nbsp;arg.strip())&nbsp;) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;newargstr&nbsp;=&nbsp;&quot;,&nbsp;&quot;.join(newargs)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;&quot;%sdef&nbsp;this(%s)&nbsp;=&nbsp;%s\n%sthis();\n&quot;&nbsp;%&nbsp;(args[0],&nbsp;newargstr,&nbsp;args[3],&nbsp;&quot;&nbsp;&quot;*16) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">def</span><span>&nbsp;doAnnotation(*args): &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;arglist&nbsp;=&nbsp;args[2].split(&quot;,&quot;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;newargs&nbsp;=&nbsp;[] &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;arg&nbsp;</span><span class="keyword">in</span><span>&nbsp;arglist:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newargs.</span><span class="builtins">append</span><span>(&nbsp;</span><span class="commonlibs">re</span><span>.sub(&quot;(\S+)\s*=\s*(\S+)&quot;,&nbsp;r&quot;val&nbsp;\1&nbsp;=&nbsp;\2&quot;,&nbsp;arg.strip())&nbsp;) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;newargstr&nbsp;=&nbsp;&quot;,&nbsp;&quot;.join(newargs)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;&quot;%s@%s{%s}%s&quot;&nbsp;%&nbsp;(args[0],&nbsp;args[1],&nbsp;newargstr,&nbsp;args[3]) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>isInDefaultConstructor&nbsp;=&nbsp;</span><span class="builtins">False</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">def</span><span>&nbsp;enterDefaultConstructor(*args): &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">global</span><span>&nbsp;isInDefaultConstructor &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;isInDefaultConstructor&nbsp;=&nbsp;</span><span class="builtins">True</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;&quot;&quot; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">def</span><span>&nbsp;leaveDefaultConstructor(*args): &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">global</span><span>&nbsp;isInDefaultConstructor &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;isInDefaultConstructor: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isInDefaultConstructor&nbsp;=&nbsp;</span><span class="builtins">False</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;&quot;&quot; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;&quot;%s}%s&quot;&nbsp;%&nbsp;(args[0],&nbsp;args[1]) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>funclist&nbsp;=&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;(&quot;(\s*)public\s+(\S+)\s*\(([^\)]+)\)(.*)&quot;,&nbsp;doConstructor), &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;(&quot;(\s*)public\s+(\S+)\s+([^\(;{]+)\s*\(\s*([^\)]+)\s*\)(.*)&quot;,&nbsp;doFunction), &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;(&quot;(\s*)public\s+(\S+)\s*\(\s*\)(.*)&quot;,&nbsp;enterDefaultConstructor), &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;(&quot;(\s*)}(\s*)&quot;,&nbsp;leaveDefaultConstructor), &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;(&quot;(\s*)@(\w+)\(([^\)=]+=[^\)]+)\)([^{]*)&quot;,&nbsp;doAnnotation), &nbsp;&nbsp;</span></li>
    <li class="alt"><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>relist&nbsp;=&nbsp;( &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;(&quot;</span><span class="keyword">import</span><span>&nbsp;([^;\*]+)(\*);&quot;,&nbsp;r&quot;</span><span class="keyword">import</span><span>&nbsp;\1._&quot;),&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;(&quot;</span><span class="keyword">import</span><span>&nbsp;([^;\*]+);&quot;,&nbsp;r&quot;</span><span class="keyword">import</span><span>&nbsp;\1&quot;), &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;(&quot;(\w+)\s+</span><span class="keyword">class</span><span>\s+(\w+)\s+implements(.*)&quot;,&nbsp;r&quot;</span><span class="keyword">class</span><span>&nbsp;\2&nbsp;extends&nbsp;\3&quot;), &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;(&quot;(\s*)public\s+(\S+)\s+([^;\(]+);&quot;,&nbsp;r&quot;var&nbsp;\3:&nbsp;\2&nbsp;=&nbsp;_&quot;), &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;(&quot;(\s*)private\s+(\S+)\s+([^;\(]+);&quot;,&nbsp;r&quot;\1private&nbsp;var&nbsp;\3:&nbsp;\2&nbsp;=&nbsp;_&quot;), &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;(&quot;(\s*)public\s+(\S+)\s+([^\(;{]+)\s*\(\s*\)(.*)&quot;,&nbsp;r&quot;\1def&nbsp;\3()&nbsp;=&nbsp;{&quot;), &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;(&quot;(\s*)</span><span class="keyword">return</span><span>\s+([^;]+);(.*)&quot;,&nbsp;r&quot;\1\2&quot;),&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">def</span><span>&nbsp;convert(inputfile,&nbsp;outputfile): &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">input</span><span>&nbsp;=&nbsp;</span><span class="builtins">file</span><span>(inputfile,&nbsp;&quot;r&quot;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;=&nbsp;</span><span class="builtins">file</span><span>(outputfile,&nbsp;&quot;w&quot;) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;eachline&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="builtins">input</span><span>.</span><span class="builtins">readlines</span><span>(): &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;=&nbsp;</span><span class="builtins">False</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;reitem&nbsp;</span><span class="keyword">in</span><span>&nbsp;relist: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;</span><span class="commonlibs">re</span><span>.match(reitem[0],&nbsp;eachline): &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newline&nbsp;=&nbsp;</span><span class="commonlibs">re</span><span>.sub(reitem[0],&nbsp;reitem[1],&nbsp;eachline) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;=&nbsp;</span><span class="builtins">True</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;newline.rstrip() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.</span><span class="builtins">write</span><span>(newline) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;matched: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;reitem&nbsp;</span><span class="keyword">in</span><span>&nbsp;funclist: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;</span><span class="commonlibs">re</span><span>.match(reitem[0],&nbsp;eachline) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;result: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newline&nbsp;=&nbsp;reitem[1](*result.groups()) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;=&nbsp;</span><span class="builtins">True</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;newline &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.</span><span class="builtins">write</span><span>(newline) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;matched: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;eachline &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.</span><span class="builtins">write</span><span>(eachline) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">def</span><span>&nbsp;getOutputFilename(inputfile): &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;inputfile.endswith(&quot;.java&quot;): &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;inputfile[:-5]&nbsp;+&nbsp;&quot;.scala&quot; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;inputfile&nbsp;+&nbsp;&quot;.scala&quot;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">__name__</span><span>&nbsp;==&nbsp;&quot;</span><span class="builtins">__main__</span><span>&quot;: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;inputfile&nbsp;=&nbsp;&quot;./src/base/</span><span class="builtins">input</span><span>.java&quot; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;outputfile&nbsp;=&nbsp;getOutputFilename(inputfile) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;convert(inputfile,&nbsp;outputfile) &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>输入一个java文件</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;base; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.util.Date; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Column; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Entity; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Table; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Temporal; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.TemporalType; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">*&nbsp;VoteVote&nbsp;generated&nbsp;by&nbsp;hbm2java </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="annotation">@Entity</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="annotation">@Table</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;mytable&quot;</span><span>,&nbsp;catalog&nbsp;=&nbsp;</span><span class="string">&quot;mydb&quot;</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyTable&nbsp;</span><span class="keyword">implements</span><span>&nbsp;java.io.Serializable&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;text; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Date&nbsp;date; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;tags; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;VoteVote()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;VoteVote(</span><span class="keyword">int</span><span>&nbsp;id,&nbsp;String&nbsp;text,&nbsp;Date&nbsp;date)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.text&nbsp;=&nbsp;text; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;VoteVote(</span><span class="keyword">int</span><span>&nbsp;id,&nbsp;String&nbsp;text,&nbsp;Date&nbsp;date,&nbsp;String&nbsp;tags)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.text&nbsp;=&nbsp;text; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags&nbsp;=&nbsp;tags; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Id</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;id&quot;</span><span>,&nbsp;unique&nbsp;=&nbsp;</span><span class="keyword">true</span><span>,&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getId()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(</span><span class="keyword">int</span><span>&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;text&quot;</span><span>,&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getText()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.text; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setText(String&nbsp;text)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.text&nbsp;=&nbsp;text; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Temporal</span><span>(TemporalType.DATE) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;date&quot;</span><span>,&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,&nbsp;length&nbsp;=&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Date&nbsp;getDate()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.date; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setDate(Date&nbsp;date)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;tags&quot;</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getTags()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.tags; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setTags(String&nbsp;tags)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags&nbsp;=&nbsp;tags; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>输出scala代码</p>
<div class="code_title">scala 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;base; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.util.Date &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Column &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Entity &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Id &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Table &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.Temporal &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;javax.persistence.TemporalType &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">*&nbsp;VoteVote&nbsp;generated&nbsp;by&nbsp;hbm2java </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="annotation">@Entity</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="annotation">@Table</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;mytable&quot;</span><span>,&nbsp;val&nbsp;catalog&nbsp;=&nbsp;</span><span class="string">&quot;mydb&quot;</span><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">class</span><span>&nbsp;MyTable&nbsp;</span><span class="keyword">extends</span><span>&nbsp;&nbsp;java.io.Serializable&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;var&nbsp;id:&nbsp;</span><span class="keyword">int</span><span>&nbsp;=&nbsp;_ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;var&nbsp;text:&nbsp;String&nbsp;=&nbsp;_ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;var&nbsp;date:&nbsp;Date&nbsp;=&nbsp;_ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;var&nbsp;tags:&nbsp;String&nbsp;=&nbsp;_ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span class="keyword">this</span><span>(id:&nbsp;</span><span class="keyword">int</span><span>,&nbsp;text:&nbsp;String,&nbsp;date:&nbsp;Date)&nbsp;=&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.text&nbsp;=&nbsp;text; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span class="keyword">this</span><span>(id:&nbsp;</span><span class="keyword">int</span><span>,&nbsp;text:&nbsp;String,&nbsp;date:&nbsp;Date,&nbsp;tags:&nbsp;String)&nbsp;=&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.text&nbsp;=&nbsp;text; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags&nbsp;=&nbsp;tags; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Id</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;id&quot;</span><span>,&nbsp;val&nbsp;unique&nbsp;=&nbsp;</span><span class="keyword">true</span><span>,&nbsp;val&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;getId()&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;setId(id:&nbsp;</span><span class="keyword">int</span><span>)&nbsp;=&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;text&quot;</span><span>,&nbsp;val&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;getText()&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.text &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;setText(text:&nbsp;String)&nbsp;=&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.text&nbsp;=&nbsp;text; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Temporal</span><span>(TemporalType.DATE) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;date&quot;</span><span>,&nbsp;val&nbsp;nullable&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,&nbsp;val&nbsp;length&nbsp;=&nbsp;</span><span class="number">0</span><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;getDate()&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;setDate(date:&nbsp;Date)&nbsp;=&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>{val&nbsp;name&nbsp;=&nbsp;</span><span class="string">&quot;tags&quot;</span><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;getTags()&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;setTags(tags:&nbsp;String)&nbsp;=&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags&nbsp;=&nbsp;tags; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>呵呵，完美完成任务</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/107970#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Aug 2007 23:55:42 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/107970</link>
        <guid>http://fakechris.javaeye.com/blog/107970</guid>
      </item>
      <item>
        <title>scala学习笔记(5) -- implicit type</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/107445" style="color:red;">http://fakechris.javaeye.com/blog/107445</a>&nbsp;
          发表时间: 2007年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">scala的implicit def是一个非常重要而且容易被人忽视的特性，通过它能够模拟很多haskell/sml类型系统特有的能力。</font></p>
<p><font face="Arial">考虑如下的接口</font></p>
<div class="code_title">scala&nbsp;代码</div>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>trait&nbsp;Filter[a]&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;def&nbsp;filter(input:a)(f:&nbsp;a=&gt;Boolean):Option[a] &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial">注意由于haskell是纯函数式语言，没有副作用，所以所有的类型都是covariant的。而scala做不到这一点，covarint、contravariant和invariant都会存在，所以这里的泛型参数没有协变。</font></p>
<p><font face="Arial">我们想写一段&ldquo;万能&rdquo;的代码处理所有类型的filter操作，于是</font></p>
<div class="code_title">scala 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>object&nbsp;Filtering{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;def&nbsp;filter[a](input:&nbsp;a)(f:&nbsp;a=&gt;&nbsp;Boolean)(filter:&nbsp;Filter[a]):&nbsp;Option[a]&nbsp;=&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;filter.filter(input)(a) &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial">现在问题来了，不是所有的对象都从Filter接口派生，我们有一个已存在的类，又不想改动既有的代码，怎么办呢？</font></p>
<p><font face="Arial">答案就是implicit type。首先重写Filtering的实现，注意currying的第二个参数定义前加上了implicit<br />
</font></p>
<div class="code_title">scala 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>object&nbsp;Filtering{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;def&nbsp;filter[a](input:&nbsp;a)(f:&nbsp;a=&gt;&nbsp;Boolean)(implicit&nbsp;filter:&nbsp;Filter[a]):&nbsp;Option[a]&nbsp;=&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;filter.filter(input)(f) &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;<font face="Arial">对于已存在的类 ExistsClass，我们创建一个新的定义，返回从Filter接口派生的基于ExistsClass的实现</font></p>
<font face="Arial">
<div class="code_title">scala 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>implicit&nbsp;def&nbsp;implicitExists&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Filter[ExistsClass]&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;def&nbsp;filter(input:ExistsClass)(f:&nbsp;ExistsClass=&gt;Boolean):Option[ExistsClass]&nbsp;=&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(f(input))&nbsp;Some(input)&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;None&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial">这样问题就很简单了，由于implicit参数可以省略，编译器会自动地在编译的时候匹配，所以可以直接调用下面的代码。这样对于写好的抽象代码只需要增加implicit type，就可以无限地扩展到任何已存在的代码中，是不是很cool的性能？现在终于可以肆意地扩展已有的java library了</font></p>
<div class="code_title">scala 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>scala&gt;&nbsp;Filtering.filter(</span><span class="keyword">new</span><span>&nbsp;ExistsClass)(a&nbsp;=&gt;&nbsp;</span><span class="keyword">true</span><span>) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>unnamed20:&nbsp;Option[ExistsClass]&nbsp;=&nbsp;Some(ExistsClass</span><span class="annotation">@1dae827</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>scala&gt;&nbsp;Filtering.filter(</span><span class="keyword">new</span><span>&nbsp;ExistsClass)(a&nbsp;=&gt;&nbsp;</span><span class="keyword">false</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>unnamed21:&nbsp;Option[ExistsClass]&nbsp;=&nbsp;None&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p><font face="Arial">最后再介绍一下implicit的另一个重要应用：type view。熟悉design pattern的人都知道wrapper pattern，当需要使用第三方的库又无法直接继承的时候，通常需要手工写一些wrapper method，如果恰巧要扩展的库有很多方法，无疑是一个非常枯燥的工作。通过scala的implicit type，我们可以定义一个类型的某种特殊的view，当compiler遇到一个对类型的未定义操作的时候，会在当前的compiler scope中自动寻找匹配的implicit def，这样对第三方的库进行扩展变成很简单的操作，implicit def一个view函数就好了。这一切都是编译期决定的，不会对性能有太大的损失，而且也保证了类型的安全性。</font></p>
<p><font face="Arial">下面的例子，immuteClass只有simple方法，通过定义wrapperClass和implicit转换函数implicitWrapper，我们为immuteClass增加了一个wrapperClass的view，这样new出来的immuteClass对象（注意是immuteClass对象！）就可以调用wrapperClass的方法了！</font></p>
<font face="Arial">
<div class="code_title">scala 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;immuteClass&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;def&nbsp;simple&nbsp;=&nbsp;println(</span><span class="string">&quot;simple&nbsp;function&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">class</span><span>&nbsp;wrapperClass(imclass:&nbsp;immuteClass)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;advance&nbsp;=&nbsp;println(</span><span class="string">&quot;advance&nbsp;function&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>object&nbsp;MainClass{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;implicit&nbsp;def&nbsp;implicitWrapper(im:&nbsp;immuteClass)&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;wrapperClass(im) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;main(args:Array[String])&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;im&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;immuteClass &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;call&nbsp;simple&nbsp;method&nbsp;in&nbsp;immuteClass&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;im.simple &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;immuteClass&nbsp;doesn't&nbsp;have&nbsp;advance&nbsp;method,&nbsp;so&nbsp;implicitWrapper&nbsp;automaticlly&nbsp;invoked </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;等价于&nbsp;implicitWrapper(im).advance </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;im.advance&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
<font face="Arial">通过上面两个例子我们看到implicit type巨大的潜力，scala的类型系统被称为&quot;Poor Man's Type System&quot;，存在于已有的巨大的java资源上面，提供了高效、易于扩展和理解的功能。对scala的抽象类型、泛型的更多心得以后再记录。</font></p>
</font>
<p><br />
</p>
</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fakechris.javaeye.com/blog/107445#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 31 Jul 2007 19:54:00 +0800</pubDate>
        <link>http://fakechris.javaeye.com/blog/107445</link>
        <guid>http://fakechris.javaeye.com/blog/107445</guid>
      </item>
      <item>
        <title>scala学习笔记(4) -- xml</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://fakechris.javaeye.com/blog/107102" style="color:red;">http://fakechris.javaeye.com/blog/107102</a>&nbsp;
          发表时间: 2007年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">scala的特色之一就是内置了对xml语法的支持，通过scala强大的语法加上<br />
xml native支持</font></p>
<p><font face="Arial">例子xml文件</font><font face="Arial"></font><font face="Arial"></font><font face="Arial"> </font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>hello</span><span class="tag"><span class="tag-name">title</span><span 