﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-豆沙包</title><link>http://www.blogjava.net/carob/</link><description>…… …… 所学 所写 所想 所做 所悟…… …… </description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 19:01:57 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 19:01:57 GMT</pubDate><ttl>60</ttl><item><title>SVG 嵌入 HTML页面的几种方式</title><link>http://www.blogjava.net/carob/archive/2006/08/20/64450.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Sun, 20 Aug 2006 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2006/08/20/64450.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/64450.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2006/08/20/64450.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/64450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/64450.html</trackback:ping><description><![CDATA[
		<p>SVG目前嵌入HTML页面中有下面几种方式<br /><br /> OBJECT <br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">object data</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">rect.svg</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> width</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">300</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> height</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">100</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br />type</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">image/svg+xml</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />codebase</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">http://www.adobe.com/svg/viewer/install/</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">/&gt;</span>
		</div>
		<p>采用Object标签的一个好处是，这是一个标准的Html 4及以上规范的有效Tag,但可惜的如果你用的是最新的Adobe Viewer，那么反而是显示不出图象来：） <br /><br />EMBED</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">embed </span>
				<span style="COLOR: #ff0000">src</span>
				<span style="COLOR: #0000ff">="rect.svg"</span>
				<span style="COLOR: #ff0000"> width</span>
				<span style="COLOR: #0000ff">="300"</span>
				<span style="COLOR: #ff0000"> height</span>
				<span style="COLOR: #0000ff">="100"</span>
				<span style="COLOR: #ff0000"> <br />type</span>
				<span style="COLOR: #0000ff">="image/svg+xml"</span>
				<span style="COLOR: #ff0000">
						<br />pluginspage</span>
				<span style="COLOR: #0000ff">="http://www.adobe.com/svg/viewer/install/"</span>
				<span style="COLOR: #ff0000"> </span>
				<span style="COLOR: #0000ff">/&gt;</span>
		</div>
		<p>这是推荐的一种写法，在ie与ff中，皆可工作，也可通过script使HTML与SVG相互通信，但不幸的是，embed不是一个规范的标签，所以不能直接用在严格的XHTML中，不过这个可以能过一个简单的trick来解决，改动一下DTD定义即可。<br /><br />IFRAME</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">iframe </span>
				<span style="COLOR: #ff0000">src</span>
				<span style="COLOR: #0000ff">="rect.svg"</span>
				<span style="COLOR: #ff0000"> width</span>
				<span style="COLOR: #0000ff">="300"</span>
				<span style="COLOR: #ff0000"> height</span>
				<span style="COLOR: #0000ff">="100"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">iframe</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>这个方式没什么好说的，完全OK，就是iframe的边框需要额外设置一下。<br /><br /><br />当然最希望看到的就是类似于下面的代码能早点在主流Browser中支持</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">html<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #ff0000">xmlns:svg</span>
				<span style="COLOR: #0000ff">="http://www.w3.org/2000/svg"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">body</span>
				<span style="COLOR: #0000ff">&gt;&lt;</span>
				<span style="COLOR: #800000">p</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">This is an HTML paragraph</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">p</span>
				<span style="COLOR: #0000ff">&gt;&lt;</span>
				<span style="COLOR: #800000">svg:svg </span>
				<span style="COLOR: #ff0000">width</span>
				<span style="COLOR: #0000ff">="300"</span>
				<span style="COLOR: #ff0000"> height</span>
				<span style="COLOR: #0000ff">="100"</span>
				<span style="COLOR: #ff0000"> version</span>
				<span style="COLOR: #0000ff">="1.1"</span>
				<span style="COLOR: #ff0000"> </span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">svg:circle </span>
				<span style="COLOR: #ff0000">cx</span>
				<span style="COLOR: #0000ff">="100"</span>
				<span style="COLOR: #ff0000"> cy</span>
				<span style="COLOR: #0000ff">="50"</span>
				<span style="COLOR: #ff0000"> r</span>
				<span style="COLOR: #0000ff">="40"</span>
				<span style="COLOR: #ff0000"> stroke</span>
				<span style="COLOR: #0000ff">="black"</span>
				<span style="COLOR: #ff0000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />stroke-width</span>
				<span style="COLOR: #0000ff">="2"</span>
				<span style="COLOR: #ff0000"> fill</span>
				<span style="COLOR: #0000ff">="red"</span>
				<span style="COLOR: #ff0000"> </span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">svg:svg</span>
				<span style="COLOR: #0000ff">&gt;&lt;/</span>
				<span style="COLOR: #800000">body</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">html</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>目前还不行，呵呵。<br /></p>
<img src ="http://www.blogjava.net/carob/aggbug/64450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2006-08-20 22:30 <a href="http://www.blogjava.net/carob/archive/2006/08/20/64450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Equinox下的WEB随想</title><link>http://www.blogjava.net/carob/archive/2006/08/15/63766.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Tue, 15 Aug 2006 12:56:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2006/08/15/63766.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/63766.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2006/08/15/63766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/63766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/63766.html</trackback:ping><description><![CDATA[
		<p>          从目前的趋势来看，OSGI在软件行业的应用相当被看好，ECLIPSE,WAS也全面采用OSGI规范了，由于eclipse自身在采用OSGI之前有一套自恰的plugin机制，而这种几乎具备无限扩充的plugin机制打开了一个巨大的plugin市场，再加上OpenSource的东风，使得eclipse几乎一统Java的IDE市场。<br />         从3.0eclipse全面采用OSGI开始，便对OSGI多了一份研究，在以eclipse为背景的桌面软件开发领域，osgi如鱼得水，但我更多的是在做Java的server端开发，很想能够看到web领域能从osgi/Equinox中得到一些灵感，很希望，那灵活的plugin/bundle机制能发挥在web的前后端开发中，之前在TSS上有人做了一个自称为RSP（与RCP相响应）的DEMO，展示了如何在Web页面中做到不重启服务器来实现页面数据的动态组装及服务请求。我们都知道在eclipse的插件开发中，我们可以单独开发一个viewpart或者菜单来插入到现成的IDE中而保持独立性，如果这种特性能在WEB中实现的话，那是相当的诱人的，现在Equinox已经实现的OSGI 的大部分规范，也提供了对serlvet及jsp的支持，但仍不够方便，希望在不久以后能看这方面的进展。<br />     </p>
<img src ="http://www.blogjava.net/carob/aggbug/63766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2006-08-15 20:56 <a href="http://www.blogjava.net/carob/archive/2006/08/15/63766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT中的Sytem Tray相关处理</title><link>http://www.blogjava.net/carob/archive/2006/03/19/36076.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Sun, 19 Mar 2006 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2006/03/19/36076.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/36076.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2006/03/19/36076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/36076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/36076.html</trackback:ping><description><![CDATA[
		<p>         SWT已经提供了对部分平台（比如window）上的系统托盘的支持。但支持得还不够好，我最近需要在一个聊天工具实现Balloon效果(粘附于系统托盘上的一个消息气泡效果，在IM软件中普遍被支持)，查一下SWT API,到目前为上并没有提供支持。但一个好消息是在月底交要出来的3.2M6中，将对部分API做调整，增加对Balloon的支持。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Milestone Plan </span>
				<span style="COLOR: #000000">3.2</span>
				<span style="COLOR: #000000"> M6 March </span>
				<span style="COLOR: #000000">31</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">2006</span>
				<span style="COLOR: #000000">  <br /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> Implement custom draw </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> table and tree <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Implement </span>
				<span style="COLOR: #0000ff">native</span>
				<span style="COLOR: #000000"> drag source effects </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> cursor <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Implement ImageTransfer support <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong><font style="BACKGROUND-COLOR: #ff0000" size="4">Implement Balloon tooltips</font></strong> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Implement Accessibility on Mac OS X </span>
		</div>
		<br />     这儿是EclipseZone上的一个针对这一效果的文章：TrayIcons and ToolTips  <a href="http://www.eclipsezone.com/eclipse/forums/t66093.rhtml">http://www.eclipsezone.com/eclipse/forums/t66093.rhtml</a><br /><br /><br />甚至在官方网站上，已经提供了这一个API的Snippet<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000; TEXT-DECORATION: underline">http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet225.java</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_128_667_Open_Image" onclick="this.style.display='none'; Codehighlighter1_128_667_Open_Text.style.display='none'; Codehighlighter1_128_667_Closed_Image.style.display='inline'; Codehighlighter1_128_667_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_128_667_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_128_667_Closed_Text.style.display='none'; Codehighlighter1_128_667_Open_Image.style.display='inline'; Codehighlighter1_128_667_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_128_667_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_128_667_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">*****************************************************************************<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * Copyright (c) 2000, 2006 IBM Corporation and others.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * All rights reserved. This program and the accompanying materials<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * are made available under the terms of the Eclipse Public License v1.0<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * which accompanies this distribution, and is available at<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * </span><span style="COLOR: #008000; TEXT-DECORATION: underline">http://www.eclipse.org/legal/epl-v10.html</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> *<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * Contributors:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> *     IBM Corporation - initial API and implementation<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> ******************************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> org.eclipse.swt.snippets;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img id="Codehighlighter1_706_887_Open_Image" onclick="this.style.display='none'; Codehighlighter1_706_887_Open_Text.style.display='none'; Codehighlighter1_706_887_Closed_Image.style.display='inline'; Codehighlighter1_706_887_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_706_887_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_706_887_Closed_Text.style.display='none'; Codehighlighter1_706_887_Open_Image.style.display='inline'; Codehighlighter1_706_887_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_706_887_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_706_887_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * Tooltip example snippet: create a balloon tooltip for a tray item<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> *<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * For a list of all SWT example snippets see<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * </span><span style="COLOR: #008000; TEXT-DECORATION: underline">http://www.eclipse.org/swt/snippets/</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * @since 3.0<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.eclipse.swt.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.eclipse.swt.graphics.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.eclipse.swt.widgets.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_1009_2167_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1009_2167_Open_Text.style.display='none'; Codehighlighter1_1009_2167_Closed_Image.style.display='inline'; Codehighlighter1_1009_2167_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1009_2167_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1009_2167_Closed_Text.style.display='none'; Codehighlighter1_1009_2167_Open_Image.style.display='inline'; Codehighlighter1_1009_2167_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Snippet225 </span><span id="Codehighlighter1_1009_2167_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1009_2167_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1051_2165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1051_2165_Open_Text.style.display='none'; Codehighlighter1_1051_2165_Closed_Image.style.display='inline'; Codehighlighter1_1051_2165_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1051_2165_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1051_2165_Closed_Text.style.display='none'; Codehighlighter1_1051_2165_Open_Image.style.display='inline'; Codehighlighter1_1051_2165_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span id="Codehighlighter1_1051_2165_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1051_2165_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Display display </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Display();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Shell shell </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Shell(display);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Image image </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> ToolTip tip </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ToolTip(shell, SWT.BALLOON </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> SWT.ICON_INFORMATION);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    tip.setMessage(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Here is message for the user. When the message is too long it wraps. I should say something cool but nothing comes to my mind.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Tray tray </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> display.getSystemTray();<br /><img id="Codehighlighter1_1424_1654_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1424_1654_Open_Text.style.display='none'; Codehighlighter1_1424_1654_Closed_Image.style.display='inline'; Codehighlighter1_1424_1654_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1424_1654_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1424_1654_Closed_Text.style.display='none'; Codehighlighter1_1424_1654_Open_Image.style.display='inline'; Codehighlighter1_1424_1654_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (tray </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_1424_1654_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1424_1654_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        TrayItem item </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> TrayItem(tray, SWT.NONE);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        image </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Image(display, Snippet225.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.getResourceAsStream(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">eclipse.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        item.setImage(image);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        tip.setText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Notification from a tray item</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        item.setToolTip(tip);<br /><img id="Codehighlighter1_1661_1738_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1661_1738_Open_Text.style.display='none'; Codehighlighter1_1661_1738_Closed_Image.style.display='inline'; Codehighlighter1_1661_1738_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1661_1738_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1661_1738_Closed_Text.style.display='none'; Codehighlighter1_1661_1738_Open_Image.style.display='inline'; Codehighlighter1_1661_1738_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_1661_1738_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1661_1738_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        tip.setText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Notification from anywhere</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        tip.setLocation(</span><span style="COLOR: #000000">400</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">400</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Button button </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Button (shell, SWT.PUSH);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    button.setText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Press for balloon tip</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img id="Codehighlighter1_1879_1952_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1879_1952_Open_Text.style.display='none'; Codehighlighter1_1879_1952_Closed_Image.style.display='inline'; Codehighlighter1_1879_1952_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1879_1952_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1879_1952_Closed_Text.style.display='none'; Codehighlighter1_1879_1952_Open_Image.style.display='inline'; Codehighlighter1_1879_1952_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    button.addListener(SWT.Selection, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Listener() </span><span id="Codehighlighter1_1879_1952_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1879_1952_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_1920_1949_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1920_1949_Open_Text.style.display='none'; Codehighlighter1_1920_1949_Closed_Image.style.display='inline'; Codehighlighter1_1920_1949_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1920_1949_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1920_1949_Closed_Text.style.display='none'; Codehighlighter1_1920_1949_Open_Image.style.display='inline'; Codehighlighter1_1920_1949_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> handleEvent(Event event) </span><span id="Codehighlighter1_1920_1949_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1920_1949_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            tip.setVisible(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    button.pack();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    shell.setBounds(</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    shell.open();<br /><img id="Codehighlighter1_2052_2106_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2052_2106_Open_Text.style.display='none'; Codehighlighter1_2052_2106_Closed_Image.style.display='inline'; Codehighlighter1_2052_2106_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2052_2106_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2052_2106_Closed_Text.style.display='none'; Codehighlighter1_2052_2106_Open_Image.style.display='inline'; Codehighlighter1_2052_2106_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">shell.isDisposed()) </span><span id="Codehighlighter1_2052_2106_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_2052_2106_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">display.readAndDispatch()) display.sleep();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (image </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) image.dispose();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    display.dispose();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p>除此之外，也有其它的第三方API实现了此一效果。是由<a href="http://www.novocode.com/">www.novocode.com</a>提供的BalloonWindow。其API可在上述的网站中获得。</p><img src ="http://www.blogjava.net/carob/aggbug/36076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2006-03-19 16:36 <a href="http://www.blogjava.net/carob/archive/2006/03/19/36076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何获取call stack(调用栈)信息——之二</title><link>http://www.blogjava.net/carob/archive/2005/03/13/2027.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Sun, 13 Mar 2005 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2005/03/13/2027.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/2027.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2005/03/13/2027.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/2027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/2027.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;从这儿可以看到：注意如果客户端程序没有显式地指定源方法名和源类名，则LogRecord 类将通过分析 call stack(调用栈)来自动提取这些信息（方法<STRONG>getSourceMethodname</STRONG>和方法<STRONG>getSourceClassName</STRONG>）,我们已经走在正确的道路上了，继续追查<STRONG>getSourceMethodname()</STRONG>…………<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_39_119_Open_Image onclick="this.style.display='none'; Codehighlighter1_39_119_Open_Text.style.display='none'; Codehighlighter1_39_119_Closed_Image.style.display='inline'; Codehighlighter1_39_119_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_39_119_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_119_Closed_Text.style.display='none'; Codehighlighter1_39_119_Open_Image.style.display='inline'; Codehighlighter1_39_119_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;getSourceClassName()&nbsp;</SPAN><SPAN id=Codehighlighter1_39_119_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_39_119_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_65_88_Open_Image onclick="this.style.display='none'; Codehighlighter1_65_88_Open_Text.style.display='none'; Codehighlighter1_65_88_Closed_Image.style.display='inline'; Codehighlighter1_65_88_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_65_88_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_88_Closed_Text.style.display='none'; Codehighlighter1_65_88_Open_Image.style.display='inline'; Codehighlighter1_65_88_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(needToInferCaller)&nbsp;</SPAN><SPAN id=Codehighlighter1_65_88_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_65_88_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inferCaller();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;sourceClassName;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV></DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;继续<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Private&nbsp;method&nbsp;to&nbsp;infer&nbsp;the&nbsp;caller's&nbsp;class&nbsp;and&nbsp;method&nbsp;names</SPAN><SPAN style="COLOR: #008000"><BR><IMG id=Codehighlighter1_94_491_Open_Image onclick="this.style.display='none'; Codehighlighter1_94_491_Open_Text.style.display='none'; Codehighlighter1_94_491_Closed_Image.style.display='inline'; Codehighlighter1_94_491_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_94_491_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_94_491_Closed_Text.style.display='none'; Codehighlighter1_94_491_Open_Image.style.display='inline'; Codehighlighter1_94_491_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;inferCaller()&nbsp;</SPAN><SPAN id=Codehighlighter1_94_491_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_94_491_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;needToInferCaller&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Get&nbsp;the&nbsp;stack&nbsp;trace.</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;StackTraceElement&nbsp;stack[]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Throwable()).getStackTrace();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;First,&nbsp;search&nbsp;back&nbsp;to&nbsp;a&nbsp;method&nbsp;in&nbsp;the&nbsp;Logger&nbsp;class.</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;ix&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_309_476_Open_Image onclick="this.style.display='none'; Codehighlighter1_309_476_Open_Text.style.display='none'; Codehighlighter1_309_476_Closed_Image.style.display='inline'; Codehighlighter1_309_476_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_309_476_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_309_476_Closed_Text.style.display='none'; Codehighlighter1_309_476_Open_Image.style.display='inline'; Codehighlighter1_309_476_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">&nbsp;(ix&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;stack.length)&nbsp;</SPAN><SPAN id=Codehighlighter1_309_476_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_309_476_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StackTraceElement&nbsp;frame&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;stack[ix];<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cname&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;frame.getClassName();<BR><IMG id=Codehighlighter1_446_462_Open_Image onclick="this.style.display='none'; Codehighlighter1_446_462_Open_Text.style.display='none'; Codehighlighter1_446_462_Closed_Image.style.display='inline'; Codehighlighter1_446_462_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_446_462_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_446_462_Closed_Text.style.display='none'; Codehighlighter1_446_462_Open_Image.style.display='inline'; Codehighlighter1_446_462_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(cname.equals(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">java.util.logging.Logger</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">))&nbsp;</SPAN><SPAN id=Codehighlighter1_446_462_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_446_462_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ix</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>………………<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>………………</SPAN></DIV></DIV></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;直至这儿，我们终于可以松一口气了，因为我们已经找到了其中的关键<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;StackTraceElement&nbsp;stack[]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Throwable()).getStackTrace();</SPAN></DIV></DIV>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;没错，就是这个StackTraceElement数组记载了我们想要的信息（类名，方法名等），这和我们用到的Exception类中的显示调用栈是一个道理的。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意：这儿通过创建一个Throwable实例，并利用在Throwable类中提供这个getStackTrace()方法，返回是StackTraceElement数组来获取到了调用栈信息。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们来看一个小例子<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_23_227_Open_Image onclick="this.style.display='none'; Codehighlighter1_23_227_Open_Text.style.display='none'; Codehighlighter1_23_227_Closed_Image.style.display='inline'; Codehighlighter1_23_227_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_23_227_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_227_Closed_Text.style.display='none'; Codehighlighter1_23_227_Open_Image.style.display='inline'; Codehighlighter1_23_227_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;CallStack&nbsp;</SPAN><SPAN id=Codehighlighter1_23_227_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_23_227_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_48_116_Open_Image onclick="this.style.display='none'; Codehighlighter1_48_116_Open_Text.style.display='none'; Codehighlighter1_48_116_Closed_Image.style.display='inline'; Codehighlighter1_48_116_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_48_116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_48_116_Closed_Text.style.display='none'; Codehighlighter1_48_116_Open_Image.style.display='inline'; Codehighlighter1_48_116_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;showTrace()&nbsp;</SPAN><SPAN id=Codehighlighter1_48_116_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_48_116_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Throwable().getStackTrace()[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">].toString();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_162_225_Open_Image onclick="this.style.display='none'; Codehighlighter1_162_225_Open_Text.style.display='none'; Codehighlighter1_162_225_Closed_Image.style.display='inline'; Codehighlighter1_162_225_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_162_225_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_162_225_Closed_Text.style.display='none'; Codehighlighter1_162_225_Open_Image.style.display='inline'; Codehighlighter1_162_225_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</SPAN><SPAN id=Codehighlighter1_162_225_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_162_225_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CallStack().showTrace());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打印如下<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter5.CallStack.showTrace(CallStack.java:5)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们亦可以通过这样一个简单地实例化一个Throwable来获取相应的call strack。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过，一般的应用级程序里面不太会用到它，可能在工具级软件里面用得多一点了：）<BR><img src ="http://www.blogjava.net/carob/aggbug/2027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2005-03-13 18:25 <a href="http://www.blogjava.net/carob/archive/2005/03/13/2027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何获取call stack(调用栈)信息——之一</title><link>http://www.blogjava.net/carob/archive/2005/03/13/2025.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Sun, 13 Mar 2005 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2005/03/13/2025.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/2025.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2005/03/13/2025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/2025.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/2025.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们中的大多数人每天都会面对logging API，JDK1.4中的Logger, Log4j等，从他们生成的log文件中，我们可以知道日志产生的第一现场信息，比如源文件名，全限定类名，当前方法名，以及记录日志是源代码中第几行等，那有没有考虑过这些信息是如何获取的呢？<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们先来看一段代码<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">…………<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>…………<BR><IMG id=Codehighlighter1_28_69_Open_Image onclick="this.style.display='none'; Codehighlighter1_28_69_Open_Text.style.display='none'; Codehighlighter1_28_69_Closed_Image.style.display='inline'; Codehighlighter1_28_69_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_28_69_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_28_69_Closed_Text.style.display='none'; Codehighlighter1_28_69_Open_Image.style.display='inline'; Codehighlighter1_28_69_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;doSomething()</SPAN><SPAN id=Codehighlighter1_28_69_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_28_69_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">doSomething()调用成功</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>…………<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>…………</SPAN></DIV></DIV>这是我最常见的日志记录方式。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我下面就开始我们的追踪以查出logging API是如何记录上面提到的这些metadata的。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这儿以JDK1.4中的logging API为研究对象。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先进入java.util.logging.Logger中，看一下info(String msg)这个方法<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_33_121_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_121_Open_Text.style.display='none'; Codehighlighter1_33_121_Closed_Image.style.display='inline'; Codehighlighter1_33_121_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_33_121_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_121_Closed_Text.style.display='none'; Codehighlighter1_33_121_Open_Image.style.display='inline'; Codehighlighter1_33_121_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;info(String&nbsp;msg)&nbsp;</SPAN><SPAN id=Codehighlighter1_33_121_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_33_121_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_76_92_Open_Image onclick="this.style.display='none'; Codehighlighter1_76_92_Open_Text.style.display='none'; Codehighlighter1_76_92_Closed_Image.style.display='inline'; Codehighlighter1_76_92_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_76_92_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_76_92_Closed_Text.style.display='none'; Codehighlighter1_76_92_Open_Image.style.display='inline'; Codehighlighter1_76_92_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(Level.INFO.intValue()&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;levelValue)&nbsp;</SPAN><SPAN id=Codehighlighter1_76_92_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_76_92_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;log(Level.INFO,&nbsp;msg);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV></DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;继续追踪<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_45_186_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_186_Open_Text.style.display='none'; Codehighlighter1_45_186_Closed_Image.style.display='inline'; Codehighlighter1_45_186_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_45_186_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_45_186_Closed_Text.style.display='none'; Codehighlighter1_45_186_Open_Image.style.display='inline'; Codehighlighter1_45_186_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;log(Level&nbsp;level,&nbsp;String&nbsp;msg)&nbsp;</SPAN><SPAN id=Codehighlighter1_45_186_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_45_186_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_109_125_Open_Image onclick="this.style.display='none'; Codehighlighter1_109_125_Open_Text.style.display='none'; Codehighlighter1_109_125_Closed_Image.style.display='inline'; Codehighlighter1_109_125_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_109_125_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_109_125_Closed_Text.style.display='none'; Codehighlighter1_109_125_Open_Image.style.display='inline'; Codehighlighter1_109_125_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(level.intValue()&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;levelValue&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;levelValue&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;offValue)&nbsp;</SPAN><SPAN id=Codehighlighter1_109_125_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_109_125_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LogRecord&nbsp;lr&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;LogRecord(level,&nbsp;msg);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;doLog(lr);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV></DIV><BR>这儿我们发现了一个值得关注的类 <STRONG>LogRecord </STRONG>,从名字上猜应该是和日志信息有关的一个类。我们来看一下它的Javadoc中的描述<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_602_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_602_Open_Text.style.display='none'; Codehighlighter1_0_602_Closed_Image.style.display='inline'; Codehighlighter1_0_602_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_602_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_602_Closed_Text.style.display='none'; Codehighlighter1_0_602_Open_Image.style.display='inline'; Codehighlighter1_0_602_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_602_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_602_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;LogRecord&nbsp;objects&nbsp;are&nbsp;used&nbsp;to&nbsp;pass&nbsp;logging&nbsp;requests&nbsp;between<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;the&nbsp;logging&nbsp;framework&nbsp;and&nbsp;individual&nbsp;log&nbsp;Handlers.<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;&lt;p&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;When&nbsp;a&nbsp;LogRecord&nbsp;is&nbsp;passed&nbsp;into&nbsp;the&nbsp;logging&nbsp;framework&nbsp;it&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;logically&nbsp;belongs&nbsp;to&nbsp;the&nbsp;framework&nbsp;and&nbsp;should&nbsp;no&nbsp;longer&nbsp;be<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;used&nbsp;or&nbsp;updated&nbsp;by&nbsp;the&nbsp;client&nbsp;application.<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;&lt;p&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Note&nbsp;that&nbsp;if&nbsp;the&nbsp;client&nbsp;application&nbsp;has&nbsp;not&nbsp;specified&nbsp;an<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;explicit&nbsp;source&nbsp;method&nbsp;name&nbsp;and&nbsp;source&nbsp;class&nbsp;name,&nbsp;then&nbsp;the<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;LogRecord&nbsp;class&nbsp;will&nbsp;infer&nbsp;them&nbsp;automatically&nbsp;when&nbsp;they&nbsp;are<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;first&nbsp;accessed&nbsp;(due&nbsp;to&nbsp;a&nbsp;call&nbsp;on&nbsp;getSourceMethodName&nbsp;or<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;getSourceClassName)&nbsp;by&nbsp;analyzing&nbsp;the&nbsp;call&nbsp;stack.&nbsp;&nbsp;<BR></SPAN></DIV></DIV></SPAN>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从这儿可以看到：注意如果客户端程序没有显式地指定源方法名和源类名，则LogRecord 类将通过分析 call stack(调用栈)来自动提取这些信息（方法<STRONG>getSourceMethodname</STRONG>和方法<STRONG>getSourceClassName</STRONG>）,我们已经走在正确的道路上了，继续追查<STRONG>getSourceMethodname()</STRONG>…………<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; （未完）<img src ="http://www.blogjava.net/carob/aggbug/2025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2005-03-13 17:58 <a href="http://www.blogjava.net/carob/archive/2005/03/13/2025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用Java Dynamic Proxy 实现类方法的拦截(AOP)</title><link>http://www.blogjava.net/carob/archive/2005/03/04/1678.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Fri, 04 Mar 2005 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2005/03/04/1678.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/1678.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2005/03/04/1678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/1678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/1678.html</trackback:ping><description><![CDATA[Java Dynamic Proxy 可以对类的指定方法实现拦截，但要求此类要实现某个Interface,拦截的方法出自此Interfacle。基于此，我们可以实现简单的AOP，要完成方法的拦截，只需要一个InvocationHandler,这个InvocationHandler即是拦截逻辑所在，实现了对目标object指定方法的筛选及调用。<BR><BR>比如我们现有一对Interface/Implemention：Speakable/Translater。<BR>Speakable接口指明了可以sayEnglish(),sayChinese()。我们目前的translater实现了这两个方法。现在我们在此基础上，增加对translater的方法的logging功能。<BR><BR>在以前，我们可以：<BR><BR>1.直接改写原代码，增加logging功能。(ugly)<BR>2.增加一个LoggingTranlater实现Speakable,采用delegation(Design Pattern)，对方法进行增强。对此类proxy可以参考jive，其中遍布proxy <IMG height=19 src="http://www.blogjava.net/Emoticons/teeth_smile.gif" width=19 border=0>。缺点就是每一个要增加的类都要实现一个代理类，可以想象，代码量急剧膨胀。<BR><BR>现在让我们来看看Java Dynamic Proxy是如何达到这一点的，声明我给出的代理是示例性的，比较简陋，主要是给出一个实现方法，加以改进，即可形成一个比较通用的工具。<BR><BR>先来看看我们的Interface/Implemention对：<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">package&nbsp;reflection.example;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_56_105_Open_Image onclick="this.style.display='none'; Codehighlighter1_56_105_Open_Text.style.display='none'; Codehighlighter1_56_105_Closed_Image.style.display='inline'; Codehighlighter1_56_105_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_56_105_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_105_Closed_Text.style.display='none'; Codehighlighter1_56_105_Open_Image.style.display='inline'; Codehighlighter1_56_105_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">interface</SPAN><SPAN style="COLOR: #000000">&nbsp;Speakable&nbsp;</SPAN><SPAN id=Codehighlighter1_56_105_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_56_105_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;sayEnglish();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;sayChinese();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">package&nbsp;reflection.example;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_74_243_Open_Image onclick="this.style.display='none'; Codehighlighter1_74_243_Open_Text.style.display='none'; Codehighlighter1_74_243_Closed_Image.style.display='inline'; Codehighlighter1_74_243_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_74_243_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_74_243_Closed_Text.style.display='none'; Codehighlighter1_74_243_Open_Image.style.display='inline'; Codehighlighter1_74_243_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Translater&nbsp;implements&nbsp;Speakable&nbsp;</SPAN><SPAN id=Codehighlighter1_74_243_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_74_243_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_106_162_Open_Image onclick="this.style.display='none'; Codehighlighter1_106_162_Open_Text.style.display='none'; Codehighlighter1_106_162_Closed_Image.style.display='inline'; Codehighlighter1_106_162_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_106_162_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_106_162_Closed_Text.style.display='none'; Codehighlighter1_106_162_Open_Image.style.display='inline'; Codehighlighter1_106_162_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;sayEnglish()&nbsp;</SPAN><SPAN id=Codehighlighter1_106_162_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_106_162_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello,i&nbsp;am&nbsp;robbie</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_194_240_Open_Image onclick="this.style.display='none'; Codehighlighter1_194_240_Open_Text.style.display='none'; Codehighlighter1_194_240_Closed_Image.style.display='inline'; Codehighlighter1_194_240_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_194_240_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_194_240_Closed_Text.style.display='none'; Codehighlighter1_194_240_Open_Image.style.display='inline'; Codehighlighter1_194_240_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;sayChinese()&nbsp;</SPAN><SPAN id=Codehighlighter1_194_240_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_194_240_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">你好，我是饺子</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>现在我们要进行logging功能了，记住，我们只需提供一个InvocationHandler:<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">package&nbsp;reflection.example;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.lang.reflect.InvocationHandler;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.lang.reflect.Method;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_173_747_Open_Image onclick="this.style.display='none'; Codehighlighter1_173_747_Open_Text.style.display='none'; Codehighlighter1_173_747_Closed_Image.style.display='inline'; Codehighlighter1_173_747_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_173_747_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_173_747_Closed_Text.style.display='none'; Codehighlighter1_173_747_Open_Image.style.display='inline'; Codehighlighter1_173_747_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;LoggingInvoktionHandler&nbsp;implements&nbsp;InvocationHandler&nbsp;</SPAN><SPAN id=Codehighlighter1_173_747_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_173_747_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;Object&nbsp;target&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_260_296_Open_Image onclick="this.style.display='none'; Codehighlighter1_260_296_Open_Text.style.display='none'; Codehighlighter1_260_296_Closed_Image.style.display='inline'; Codehighlighter1_260_296_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_260_296_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_260_296_Closed_Text.style.display='none'; Codehighlighter1_260_296_Open_Image.style.display='inline'; Codehighlighter1_260_296_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;LoggingInvoktionHandler(Object&nbsp;target)&nbsp;</SPAN><SPAN id=Codehighlighter1_260_296_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_260_296_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.target&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;target;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)<BR><IMG id=Codehighlighter1_397_472_Open_Image onclick="this.style.display='none'; Codehighlighter1_397_472_Open_Text.style.display='none'; Codehighlighter1_397_472_Closed_Image.style.display='inline'; Codehighlighter1_397_472_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_397_472_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_397_472_Closed_Text.style.display='none'; Codehighlighter1_397_472_Open_Image.style.display='inline'; Codehighlighter1_397_472_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;Throwable&nbsp;</SPAN><SPAN id=Codehighlighter1_397_472_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_397_472_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging(method);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;method.invoke(target,&nbsp;args);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_515_744_Open_Image onclick="this.style.display='none'; Codehighlighter1_515_744_Open_Text.style.display='none'; Codehighlighter1_515_744_Closed_Image.style.display='inline'; Codehighlighter1_515_744_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_515_744_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_515_744_Closed_Text.style.display='none'; Codehighlighter1_515_744_Open_Image.style.display='inline'; Codehighlighter1_515_744_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;logging(Method&nbsp;method)&nbsp;</SPAN><SPAN id=Codehighlighter1_515_744_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_515_744_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_568_618_Open_Image onclick="this.style.display='none'; Codehighlighter1_568_618_Open_Text.style.display='none'; Codehighlighter1_568_618_Closed_Image.style.display='inline'; Codehighlighter1_568_618_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_568_618_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_568_618_Closed_Text.style.display='none'; Codehighlighter1_568_618_Open_Image.style.display='inline'; Codehighlighter1_568_618_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">sayChinese</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">.equals(method.getName()))&nbsp;</SPAN><SPAN id=Codehighlighter1_568_618_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_568_618_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">翻译开始</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_672_738_Open_Image onclick="this.style.display='none'; Codehighlighter1_672_738_Open_Text.style.display='none'; Codehighlighter1_672_738_Closed_Image.style.display='inline'; Codehighlighter1_672_738_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_672_738_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_672_738_Closed_Text.style.display='none'; Codehighlighter1_672_738_Open_Image.style.display='inline'; Codehighlighter1_672_738_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">sayEnglish</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">.equals(method.getName()))&nbsp;</SPAN><SPAN id=Codehighlighter1_672_738_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_672_738_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Tranlation&nbsp;beginning</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P><BR>这个LoggingInvocationHandler实现了InvocationHandler接中。方法的代理调用在invoke(……)中，可以如我添加logging()功能一样，加入其它的任何想要的功能，然后再进行 real target的方法调用。<BR><BR>如果将logging(Method&nbsp;method)中的逻辑抽出来，放到外部文件(XML)中进行配置读取。再对方法名采用正则表达式。是不是更为通用了呢？</P>
<P>下面是客户端调用：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">package&nbsp;reflection.example;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.lang.reflect.Proxy;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_80_519_Open_Image onclick="this.style.display='none'; Codehighlighter1_80_519_Open_Text.style.display='none'; Codehighlighter1_80_519_Closed_Image.style.display='inline'; Codehighlighter1_80_519_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_80_519_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_519_Closed_Text.style.display='none'; Codehighlighter1_80_519_Open_Image.style.display='inline'; Codehighlighter1_80_519_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Main&nbsp;</SPAN><SPAN id=Codehighlighter1_80_519_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_80_519_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_87_116_Open_Image onclick="this.style.display='none'; Codehighlighter1_87_116_Open_Text.style.display='none'; Codehighlighter1_87_116_Closed_Image.style.display='inline'; Codehighlighter1_87_116_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_87_116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_116_Closed_Text.style.display='none'; Codehighlighter1_87_116_Open_Image.style.display='inline'; Codehighlighter1_87_116_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_87_116_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_87_116_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_161_517_Open_Image onclick="this.style.display='none'; Codehighlighter1_161_517_Open_Text.style.display='none'; Codehighlighter1_161_517_Closed_Image.style.display='inline'; Codehighlighter1_161_517_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_161_517_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_161_517_Closed_Text.style.display='none'; Codehighlighter1_161_517_Open_Image.style.display='inline'; Codehighlighter1_161_517_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</SPAN><SPAN id=Codehighlighter1_161_517_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_161_517_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Speakable&nbsp;speaker&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Translater();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Speakable&nbsp;loggingSpeaker&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(Speakable)&nbsp;Proxy.newProxyInstance(<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;speaker.getClass().getClassLoader(),<BR><IMG id=Codehighlighter1_362_380_Open_Image onclick="this.style.display='none'; Codehighlighter1_362_380_Open_Text.style.display='none'; Codehighlighter1_362_380_Closed_Image.style.display='inline'; Codehighlighter1_362_380_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_362_380_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_362_380_Closed_Text.style.display='none'; Codehighlighter1_362_380_Open_Image.style.display='inline'; Codehighlighter1_362_380_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Class[]&nbsp;</SPAN><SPAN id=Codehighlighter1_362_380_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_362_380_Open_Text><SPAN style="COLOR: #000000">{&nbsp;Speakable.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">,<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;LoggingInvoktionHandler(speaker));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loggingSpeaker.sayChinese();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loggingSpeaker.sayEnglish();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P><BR><BR>是不是非常简单呢？：)<BR><BR>如果到此为止，还是看不出Dynamic在哪儿的，想想我这儿给出的示例与spring的AOP的不同，呵呵，区别在于我这儿给出的Main亦是spring AOP的一部分，在spring里， 对某个Interface的target的代理，采用了Reflection，以达到普遍适用的，不用象我这样直接显式地给出类名而已。若我把Main做成一个Helper类，同时，把配置接口及他的实现类都放到外部XML中配置，是不是就有点象一个超级简化的spring AOP了？<BR><BR>当然spring不是完全用Java Dynamic Proxy的，因为Java Dynamic Proxy的前提——<STRONG>针对接口编程</STRONG>！，针对普通的类的AOP，Spring采用了字节码增强来实现。<BR><BR><BR></P><img src ="http://www.blogjava.net/carob/aggbug/1678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2005-03-04 10:37 <a href="http://www.blogjava.net/carob/archive/2005/03/04/1678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过Java Reflection 获取指定static变量的值</title><link>http://www.blogjava.net/carob/archive/2005/03/04/1675.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Fri, 04 Mar 2005 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2005/03/04/1675.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/1675.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2005/03/04/1675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/1675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/1675.html</trackback:ping><description><![CDATA[比如：有一个SQLUtil类，是一个Hibernate项目中的用来存储一系列sql的类，皆为常量。在其它的类中可以根据变量的名称来索引相应的值，问题在于名称在另外的类中亦为变量，直接索引是没有办法的，但可以透过Java Reflection非常方便的实现。给出的是示意性代码，相应的Exception处理显然不够 <STRONG>elegant</STRONG><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_153_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_153_Open_Text.style.display='none'; Codehighlighter1_0_153_Closed_Image.style.display='inline'; Codehighlighter1_0_153_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_153_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_153_Closed_Text.style.display='none'; Codehighlighter1_0_153_Open_Image.style.display='inline'; Codehighlighter1_0_153_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_153_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_153_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Created&nbsp;on&nbsp;2005-3-3<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;TODO&nbsp;To&nbsp;change&nbsp;the&nbsp;template&nbsp;for&nbsp;this&nbsp;generated&nbsp;file&nbsp;go&nbsp;to<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Window&nbsp;-&nbsp;Preferences&nbsp;-&nbsp;Java&nbsp;-&nbsp;Code&nbsp;Style&nbsp;-&nbsp;Code&nbsp;Templates<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;reflection;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_176_331_Open_Image onclick="this.style.display='none'; Codehighlighter1_176_331_Open_Text.style.display='none'; Codehighlighter1_176_331_Closed_Image.style.display='inline'; Codehighlighter1_176_331_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_176_331_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_176_331_Closed_Text.style.display='none'; Codehighlighter1_176_331_Open_Image.style.display='inline'; Codehighlighter1_176_331_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_176_331_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_176_331_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@author&nbsp;ruby<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;TODO&nbsp;To&nbsp;change&nbsp;the&nbsp;template&nbsp;for&nbsp;this&nbsp;generated&nbsp;type&nbsp;comment&nbsp;go&nbsp;to<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Window&nbsp;-&nbsp;Preferences&nbsp;-&nbsp;Java&nbsp;-&nbsp;Code&nbsp;Style&nbsp;-&nbsp;Code&nbsp;Templates<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_354_409_Open_Image onclick="this.style.display='none'; Codehighlighter1_354_409_Open_Text.style.display='none'; Codehighlighter1_354_409_Closed_Image.style.display='inline'; Codehighlighter1_354_409_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_354_409_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_354_409_Closed_Text.style.display='none'; Codehighlighter1_354_409_Open_Image.style.display='inline'; Codehighlighter1_354_409_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SQLUtil&nbsp;</SPAN><SPAN id=Codehighlighter1_354_409_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_354_409_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;final&nbsp;String&nbsp;SELECT_SQL</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">from&nbsp;Ruby</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_153_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_153_Open_Text.style.display='none'; Codehighlighter1_0_153_Closed_Image.style.display='inline'; Codehighlighter1_0_153_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_153_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_153_Closed_Text.style.display='none'; Codehighlighter1_0_153_Open_Image.style.display='inline'; Codehighlighter1_0_153_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_153_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_153_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Created&nbsp;on&nbsp;2005-3-3<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;TODO&nbsp;To&nbsp;change&nbsp;the&nbsp;template&nbsp;for&nbsp;this&nbsp;generated&nbsp;file&nbsp;go&nbsp;to<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Window&nbsp;-&nbsp;Preferences&nbsp;-&nbsp;Java&nbsp;-&nbsp;Code&nbsp;Style&nbsp;-&nbsp;Code&nbsp;Templates<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;reflection;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.lang.reflect.Field;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_209_365_Open_Image onclick="this.style.display='none'; Codehighlighter1_209_365_Open_Text.style.display='none'; Codehighlighter1_209_365_Closed_Image.style.display='inline'; Codehighlighter1_209_365_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_209_365_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_209_365_Closed_Text.style.display='none'; Codehighlighter1_209_365_Open_Image.style.display='inline'; Codehighlighter1_209_365_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_209_365_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_209_365_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@author&nbsp;ruby<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;TODO&nbsp;To&nbsp;change&nbsp;the&nbsp;template&nbsp;for&nbsp;this&nbsp;generated&nbsp;type&nbsp;comment&nbsp;go&nbsp;to&nbsp;Window&nbsp;-<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Preferences&nbsp;-&nbsp;Java&nbsp;-&nbsp;Code&nbsp;Style&nbsp;-&nbsp;Code&nbsp;Templates<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_388_821_Open_Image onclick="this.style.display='none'; Codehighlighter1_388_821_Open_Text.style.display='none'; Codehighlighter1_388_821_Closed_Image.style.display='inline'; Codehighlighter1_388_821_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_388_821_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_388_821_Closed_Text.style.display='none'; Codehighlighter1_388_821_Open_Image.style.display='inline'; Codehighlighter1_388_821_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Manager&nbsp;</SPAN><SPAN id=Codehighlighter1_388_821_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_388_821_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;getValue(String&nbsp;sqlName)&nbsp;throws&nbsp;SecurityException,<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoSuchFieldException,&nbsp;IllegalArgumentException,<BR><IMG id=Codehighlighter1_541_624_Open_Image onclick="this.style.display='none'; Codehighlighter1_541_624_Open_Text.style.display='none'; Codehighlighter1_541_624_Closed_Image.style.display='inline'; Codehighlighter1_541_624_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_541_624_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_541_624_Closed_Text.style.display='none'; Codehighlighter1_541_624_Open_Image.style.display='inline'; Codehighlighter1_541_624_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IllegalAccessException&nbsp;</SPAN><SPAN id=Codehighlighter1_541_624_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_541_624_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;f&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;SQLUtil.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">.getField(sqlName);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;f.</SPAN><SPAN style="COLOR: #0000ff">get</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">).toString();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;SecurityException,<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoSuchFieldException,&nbsp;IllegalArgumentException,<BR><IMG id=Codehighlighter1_770_819_Open_Image onclick="this.style.display='none'; Codehighlighter1_770_819_Open_Text.style.display='none'; Codehighlighter1_770_819_Closed_Image.style.display='inline'; Codehighlighter1_770_819_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_770_819_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_770_819_Closed_Text.style.display='none'; Codehighlighter1_770_819_Open_Image.style.display='inline'; Codehighlighter1_770_819_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IllegalAccessException&nbsp;</SPAN><SPAN id=Codehighlighter1_770_819_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_770_819_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(getValue(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">SELECT_SQL</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV><img src ="http://www.blogjava.net/carob/aggbug/1675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2005-03-04 09:28 <a href="http://www.blogjava.net/carob/archive/2005/03/04/1675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搬到新家来：)</title><link>http://www.blogjava.net/carob/archive/2005/02/28/1562.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Mon, 28 Feb 2005 12:10:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2005/02/28/1562.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/1562.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2005/02/28/1562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/1562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/1562.html</trackback:ping><description><![CDATA[相中了这儿的编辑器中的“代码”功能，贴出的代码很齐整<IMG height=19 src="http://www.blogjava.net/Emoticons/regular_smile.gif" width=19 border=0>。<BR>“博客园”还应做得再专业一点才行，注册的时候，按着提示走，竟然导航是错误的，注册到其它地方去了。<img src ="http://www.blogjava.net/carob/aggbug/1562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2005-02-28 20:10 <a href="http://www.blogjava.net/carob/archive/2005/02/28/1562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Groovlets </title><link>http://www.blogjava.net/carob/archive/2005/02/28/1564.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Mon, 28 Feb 2005 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2005/02/28/1564.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/1564.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2005/02/28/1564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/1564.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/1564.html</trackback:ping><description><![CDATA[<P>你能在Groovy里面写普通的Java Servlet。<BR>存在一个<STRONG>GroovyServlet</STRONG>，自动编译.groovy文件，转变成字节码，装载类，并缓存它们，直到修改了源文件。<BR>这儿有一个简单的例子来向你说明这事：<BR>(注意访问session,output,request的隐式变量的用法)<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;java.util.Date<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_52_76_Open_Image onclick="this.style.display='none'; Codehighlighter1_52_76_Open_Text.style.display='none'; Codehighlighter1_52_76_Closed_Image.style.display='inline'; Codehighlighter1_52_76_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_52_76_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_76_Closed_Text.style.display='none'; Codehighlighter1_52_76_Open_Image.style.display='inline'; Codehighlighter1_52_76_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(session.counter&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_52_76_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_52_76_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;session.counter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>println&nbsp;</SPAN><SPAN style="COLOR: #000000">"""<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">html</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">head</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">title</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">Groovy&nbsp;Servlet</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">title</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">head</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">body</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_178_197_Open_Image onclick="this.style.display='none'; Codehighlighter1_178_197_Open_Text.style.display='none'; Codehighlighter1_178_197_Closed_Image.style.display='inline'; Codehighlighter1_178_197_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_178_197_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_178_197_Closed_Text.style.display='none'; Codehighlighter1_178_197_Open_Image.style.display='inline'; Codehighlighter1_178_197_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>Hello,&nbsp;$</SPAN><SPAN id=Codehighlighter1_178_197_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_178_197_Open_Text><SPAN style="COLOR: #000000">{request.remoteHost}</SPAN></SPAN><SPAN style="COLOR: #000000">:&nbsp;$</SPAN><SPAN id=Codehighlighter1_201_217_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_201_217_Open_Text><SPAN style="COLOR: #000000">{session.counter}</SPAN></SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">&nbsp;$</SPAN><SPAN id=Codehighlighter1_221_232_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_221_232_Open_Text><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Date()}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">body</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">html</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">"""<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">session.counter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;session.counter&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN></DIV></DIV>或者，用MarkupBuilder完成相同的功能<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;java.util.Date<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;groovy.xml.MarkupBuilder<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_84_112_Open_Image onclick="this.style.display='none'; Codehighlighter1_84_112_Open_Text.style.display='none'; Codehighlighter1_84_112_Closed_Image.style.display='inline'; Codehighlighter1_84_112_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_84_112_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_84_112_Closed_Text.style.display='none'; Codehighlighter1_84_112_Open_Image.style.display='inline'; Codehighlighter1_84_112_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(session.counter&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_84_112_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_84_112_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.counter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_125_313_Open_Image onclick="this.style.display='none'; Codehighlighter1_125_313_Open_Text.style.display='none'; Codehighlighter1_125_313_Closed_Image.style.display='inline'; Codehighlighter1_125_313_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_125_313_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_313_Closed_Text.style.display='none'; Codehighlighter1_125_313_Open_Image.style.display='inline'; Codehighlighter1_125_313_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>html.html&nbsp;</SPAN><SPAN id=Codehighlighter1_125_313_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_125_313_Open_Text><SPAN style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;html&nbsp;is&nbsp;implicitly&nbsp;bound&nbsp;to&nbsp;new&nbsp;MarkupBuilder(out)</SPAN><SPAN style="COLOR: #008000"><BR><IMG id=Codehighlighter1_191_225_Open_Image onclick="this.style.display='none'; Codehighlighter1_191_225_Open_Text.style.display='none'; Codehighlighter1_191_225_Closed_Image.style.display='inline'; Codehighlighter1_191_225_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_191_225_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_191_225_Closed_Text.style.display='none'; Codehighlighter1_191_225_Open_Image.style.display='inline'; Codehighlighter1_191_225_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;head&nbsp;</SPAN><SPAN id=Codehighlighter1_191_225_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_191_225_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Groovy&nbsp;Servlet</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_234_311_Open_Image onclick="this.style.display='none'; Codehighlighter1_234_311_Open_Text.style.display='none'; Codehighlighter1_234_311_Closed_Image.style.display='inline'; Codehighlighter1_234_311_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_234_311_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_234_311_Closed_Text.style.display='none'; Codehighlighter1_234_311_Open_Image.style.display='inline'; Codehighlighter1_234_311_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;body&nbsp;</SPAN><SPAN id=Codehighlighter1_234_311_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_234_311_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;p(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello,&nbsp;${request.remoteHost}:&nbsp;${session.counter}!&nbsp;${new&nbsp;Date()}</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>session.counter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;session.counter&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN></DIV></DIV><BR>隐式变量<BR><BR><IMG title="implicit variables" height=243 alt="o_implicit variables.jpg" src="http://www.blogjava.net/images/blogjava_net/carob/536/o_implicit%20variables.jpg" width=361 border=0><BR><BR>* 这些变量在groovylet里面不能被再次赋值。他们在第一次访问时被绑定，允许诸如在用"out"之前调用对象"response"的方法。<BR><BR><STRONG>建立Groovylet<BR><BR></STRONG>将下面放入web.xml中<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><FONT style="BACKGROUND-COLOR: #ffffff"><PRE><SPAN class=xml-tag>&lt;servlet&gt;</SPAN>
<SPAN class=xml-tag>&lt;servlet-name&gt;</SPAN>Groovy<SPAN class=xml-tag>&lt;/servlet-name&gt;</SPAN>
<SPAN class=xml-tag>&lt;servlet-class&gt;</SPAN>groovy.servlet.GroovyServlet<SPAN class=xml-tag>&lt;/servlet-class&gt;</SPAN>
<SPAN class=xml-tag>&lt;/servlet&gt;</SPAN>

<SPAN class=xml-tag>&lt;servlet-mapping&gt;</SPAN>
<SPAN class=xml-tag>&lt;servlet-name&gt;</SPAN>Groovy<SPAN class=xml-tag>&lt;/servlet-name&gt;</SPAN>
<SPAN class=xml-tag>&lt;url-pattern&gt;</SPAN>*.groovy<SPAN class=xml-tag>&lt;/url-pattern&gt;</SPAN>
<SPAN class=xml-tag>&lt;/servlet-mapping&gt;</SPAN></PRE></FONT></DIV><BR>然后，所有groovy jar文件放到WEB/lib目录下(只需放入groovy.jar和asm.jar即可)<BR><BR>把.groovy文件放入根目录(放html文件的地方)中，groovy servlet将会照管这些.groovy文件<BR><BR>就这个例子使用tomcat来说，要编辑tomcat/conf/server.xml ，类似于下面这样<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 33px"><FONT style="BACKGROUND-COLOR: #ffffff"><PRE><SPAN class=xml-tag><PRE><SPAN class=xml-tag>&lt;Context path=<SPAN class=xml-quote>"/groovy"</SPAN> docBase=<SPAN class=xml-quote>"c:/groovy-servlet"</SPAN>/&gt;</SPAN></PRE></SPAN></PRE></FONT></DIV><BR><BR><IMG height=1 src="http://www.cnweblog.com/carob/aggbug/2295.html" width=1><img src ="http://www.blogjava.net/carob/aggbug/1564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2005-02-28 11:18 <a href="http://www.blogjava.net/carob/archive/2005/02/28/1564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GSQL</title><link>http://www.blogjava.net/carob/archive/2005/02/28/1565.html</link><dc:creator>carob</dc:creator><author>carob</author><pubDate>Mon, 28 Feb 2005 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/carob/archive/2005/02/28/1565.html</guid><wfw:comment>http://www.blogjava.net/carob/comments/1565.html</wfw:comment><comments>http://www.blogjava.net/carob/archive/2005/02/28/1565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carob/comments/commentRss/1565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carob/services/trackbacks/1565.html</trackback:ping><description><![CDATA[GSQL使用户能非常简单地访问/修改关系型数据库。<BR>举例：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_0_163_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_163_Open_Text.style.display='none'; Codehighlighter1_0_163_Closed_Image.style.display='inline'; Codehighlighter1_0_163_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_163_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_163_Closed_Text.style.display='none'; Codehighlighter1_0_163_Open_Image.style.display='inline'; Codehighlighter1_0_163_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_163_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_163_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;Test&nbsp;to&nbsp;verify&nbsp;valid&nbsp;construction&nbsp;of&nbsp;default&nbsp;DDL<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@author&nbsp;&lt;a&nbsp;href="mailto:jeremy.rayner@bigfoot.com"&gt;Jeremy&nbsp;Rayner&lt;/a&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@version&nbsp;$Revision:&nbsp;1.2&nbsp;$<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;org.javanicus.gsql<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_257_1598_Open_Image onclick="this.style.display='none'; Codehighlighter1_257_1598_Open_Text.style.display='none'; Codehighlighter1_257_1598_Closed_Image.style.display='inline'; Codehighlighter1_257_1598_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_257_1598_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_257_1598_Closed_Text.style.display='none'; Codehighlighter1_257_1598_Open_Image.style.display='inline'; Codehighlighter1_257_1598_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SqlGeneratorTest&nbsp;extends&nbsp;GroovyTestCase&nbsp;</SPAN><SPAN id=Codehighlighter1_257_1598_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_257_1598_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;database<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;sqlGenerator<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_339_1354_Open_Image onclick="this.style.display='none'; Codehighlighter1_339_1354_Open_Text.style.display='none'; Codehighlighter1_339_1354_Closed_Image.style.display='inline'; Codehighlighter1_339_1354_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_339_1354_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_339_1354_Closed_Text.style.display='none'; Codehighlighter1_339_1354_Open_Image.style.display='inline'; Codehighlighter1_339_1354_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;setUp()&nbsp;</SPAN><SPAN id=Codehighlighter1_339_1354_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_339_1354_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typeMap&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;TypeMap()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;build&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;RelationalBuilder(typeMap)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlGenerator&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SqlGenerator(typeMap,System.getProperty(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">line.separator</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;))<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_596_1348_Open_Image onclick="this.style.display='none'; Codehighlighter1_596_1348_Open_Text.style.display='none'; Codehighlighter1_596_1348_Closed_Image.style.display='inline'; Codehighlighter1_596_1348_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_596_1348_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_596_1348_Closed_Text.style.display='none'; Codehighlighter1_596_1348_Open_Image.style.display='inline'; Codehighlighter1_596_1348_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;database&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;build.database(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">genealogy</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_596_1348_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_596_1348_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_628_811_Open_Image onclick="this.style.display='none'; Codehighlighter1_628_811_Open_Text.style.display='none'; Codehighlighter1_628_811_Closed_Image.style.display='inline'; Codehighlighter1_628_811_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_628_811_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_628_811_Closed_Text.style.display='none'; Codehighlighter1_628_811_Open_Image.style.display='inline'; Codehighlighter1_628_811_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">event</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_628_811_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_628_811_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">event_id</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;type:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">integer</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;size:</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">,&nbsp;primaryKey:</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">,&nbsp;required:</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">description</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;type:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">varchar</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;size:</SPAN><SPAN style="COLOR: #000000">30</SPAN><SPAN style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_848_1338_Open_Image onclick="this.style.display='none'; Codehighlighter1_848_1338_Open_Text.style.display='none'; Codehighlighter1_848_1338_Closed_Image.style.display='inline'; Codehighlighter1_848_1338_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_848_1338_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_848_1338_Closed_Text.style.display='none'; Codehighlighter1_848_1338_Open_Image.style.display='inline'; Codehighlighter1_848_1338_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">individual</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_848_1338_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_848_1338_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">individual_id</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;type:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">integer</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;size:</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">,&nbsp;required:</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">,&nbsp;primaryKey:</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">,&nbsp;autoIncrement:</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">surname</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;type:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">varchar</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;size:</SPAN><SPAN style="COLOR: #000000">15</SPAN><SPAN style="COLOR: #000000">,&nbsp;required:</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">event_id</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;type:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">integer</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,&nbsp;size:</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_1149_1226_Open_Image onclick="this.style.display='none'; Codehighlighter1_1149_1226_Open_Text.style.display='none'; Codehighlighter1_1149_1226_Closed_Image.style.display='inline'; Codehighlighter1_1149_1226_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1149_1226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1149_1226_Closed_Text.style.display='none'; Codehighlighter1_1149_1226_Open_Image.style.display='inline'; Codehighlighter1_1149_1226_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreignKey(foreignTable:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">event</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_1149_1226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1149_1226_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference(local:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">event_id</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">,foreign:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">event_id</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_1268_1326_Open_Image onclick="this.style.display='none'; Codehighlighter1_1268_1326_Open_Text.style.display='none'; Codehighlighter1_1268_1326_Closed_Image.style.display='inline'; Codehighlighter1_1268_1326_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1268_1326_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1268_1326_Closed_Text.style.display='none'; Codehighlighter1_1268_1326_Open_Image.style.display='inline'; Codehighlighter1_1268_1326_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">surname_index</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_1268_1326_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1268_1326_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexColumn(name:</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">surname</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_1388_1595_Open_Image onclick="this.style.display='none'; Codehighlighter1_1388_1595_Open_Text.style.display='none'; Codehighlighter1_1388_1595_Closed_Image.style.display='inline'; Codehighlighter1_1388_1595_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1388_1595_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1388_1595_Closed_Text.style.display='none'; Codehighlighter1_1388_1595_Open_Image.style.display='inline'; Codehighlighter1_1388_1595_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;testGenerateDDL()&nbsp;</SPAN><SPAN id=Codehighlighter1_1388_1595_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1388_1595_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testWriter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;PrintWriter(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileOutputStream(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">SqlGeneratorTest.sql</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">))<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlGenerator.writer&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;testWriter<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlGenerator.createDatabase(database,</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testWriter.flush()<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV><img src ="http://www.cnweblog.com/carob/aggbug/2291.html" width = "1" height = "1" /><img src ="http://www.blogjava.net/carob/aggbug/1565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carob/" target="_blank">carob</a> 2005-02-28 10:26 <a href="http://www.blogjava.net/carob/archive/2005/02/28/1565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>