﻿<?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-steeven-随笔分类-胡思乱想</title><link>http://www.blogjava.net/steeven/category/6471.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:32:16 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:32:16 GMT</pubDate><ttl>60</ttl><item><title>db4o，没有主键？</title><link>http://www.blogjava.net/steeven/archive/2006/06/19/53836.html</link><dc:creator>steeven</dc:creator><author>steeven</author><pubDate>Mon, 19 Jun 2006 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/steeven/archive/2006/06/19/53836.html</guid><wfw:comment>http://www.blogjava.net/steeven/comments/53836.html</wfw:comment><comments>http://www.blogjava.net/steeven/archive/2006/06/19/53836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/steeven/comments/commentRss/53836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steeven/services/trackbacks/53836.html</trackback:ping><description><![CDATA[
		<p>db4o目前还没有unique index/primary key机制。(5.4)</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 id="Codehighlighter1_40_276_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_276_Open_Text.style.display='none'; Codehighlighter1_40_276_Closed_Image.style.display='inline'; Codehighlighter1_40_276_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_40_276_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_40_276_Closed_Text.style.display='none'; Codehighlighter1_40_276_Open_Image.style.display='inline'; Codehighlighter1_40_276_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #000000">    </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_40_276_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_40_276_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ObjectContainer db </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> Db4o.openFile(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">test.yap</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        db.set(</span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> User(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">abc</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #000000">234</span>
						<span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        db.set(</span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> User(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">abc</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #000000">234</span>
						<span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ObjectSet</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">User</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> list </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> db.query(User.</span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(list);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        db.close(); </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">halt without this line in 5.2</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    }</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>上面的例子会存储两个同样的User对象。<br />仅有的ID是一个存储文件中的ID, 经过碎片整理之后会发生变化，显然不适用。<br />要实现一个auto_increament的主键恐怕要自行实现。或者用已有的UUID实现。<br /><br />可能db4o太年轻的关系，目前还没有支援这些功能。建议用@Annotation来实现。并且控制存储。<br />@ID<br />@Unique<br />@Index<br />在EJB3里面已经有现成的定义可以参考。<img src ="http://www.blogjava.net/steeven/aggbug/53836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steeven/" target="_blank">steeven</a> 2006-06-19 18:15 <a href="http://www.blogjava.net/steeven/archive/2006/06/19/53836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>YY一下未来的用户界面</title><link>http://www.blogjava.net/steeven/archive/2006/06/18/53657.html</link><dc:creator>steeven</dc:creator><author>steeven</author><pubDate>Sun, 18 Jun 2006 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/steeven/archive/2006/06/18/53657.html</guid><wfw:comment>http://www.blogjava.net/steeven/comments/53657.html</wfw:comment><comments>http://www.blogjava.net/steeven/archive/2006/06/18/53657.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/steeven/comments/commentRss/53657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steeven/services/trackbacks/53657.html</trackback:ping><description><![CDATA[原来说是xaml只是随着下一个版本的windows放出，后来改编到winfx里面，最近听说作为.net3.0出现．这样的直接后果就是这个b/s+c/s通吃的UI框架不但要寄生在新版windows里面，也要被用来在xp上攻城略地．<br /><br />微软这回蓄势待发xaml有多强大呢？3d（感觉不够纯粹）／强大的数据绑定／动画／多媒体支持．．．<br />这里可怕的不仅仅是框架，还有配套的GUI开发工具．有趣的是Interactive Designer据说就是用wpf开发的．<br />xaml只是个xml描述文件，里面可以包含代码，编译成UI界面．所有的界面内容也可以由程序动态运行．<br />这样未来运行在browser里面的UI不是复杂的ajax，是和后台一致的托管代码．<br /><br />Java怎样应对呢？Java+Flash? 开发bs都困难重重．除非Flash能放弃as，直接同java结合，或者两个公司合作开发一个新框架．这个新框架应该是什么样子呢？完全的3D视角，时间轴控制．．．重演c#后来居上的历史．<br /><br />Java在Sun的手里一直半死不活，真希望能赶快被google并购，或者sun主动把java捐赠出来．<br /><br />如果没有＂意外＂，在wpf正式发行以后，桌面应用将逐步过渡到wpf开发．HTML由于其跨平台，可能会平分秋色．<br /><br />面对wpf，如何反抗？java.net是太监，在.net阵营里面连二奶都不算，等于投降．<br />利用xaml? xaml被编译加载，其执行框架还是.net，机会似乎不大．在浏览器上可能会有类似lasszlo的组合．<br /><br />作为Java爱好者，祈祷奇迹发生吧，还好在Java世界中奇迹是家常便饭 :)<img src ="http://www.blogjava.net/steeven/aggbug/53657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steeven/" target="_blank">steeven</a> 2006-06-18 22:57 <a href="http://www.blogjava.net/steeven/archive/2006/06/18/53657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gwt和echo2的对比</title><link>http://www.blogjava.net/steeven/archive/2006/06/01/49502.html</link><dc:creator>steeven</dc:creator><author>steeven</author><pubDate>Thu, 01 Jun 2006 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/steeven/archive/2006/06/01/49502.html</guid><wfw:comment>http://www.blogjava.net/steeven/comments/49502.html</wfw:comment><comments>http://www.blogjava.net/steeven/archive/2006/06/01/49502.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/steeven/comments/commentRss/49502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steeven/services/trackbacks/49502.html</trackback:ping><description><![CDATA[
		<p>前面转贴Liebeck(echo的主要开发者，我的偶像)关于echo2和gwt的对比:http://www.blogjava.net/steeven/archive/2006/06/01/49379.html<br /><br />今天仔细做了一些笔记，并且加入了一些自己的想法，供选型者参考：<br /><br />综合对比：<br />1. 两个都是非传统的b/s框架，都是用AJAX来构造动态网站。编程过程都和SWT/Swing差不多。<br />2. 区别在于一个运行于客户端，一个运行于服务器</p>
		<div>3. gwt把代码编译为html+js, 目前只支持java1.4规范。echo没这限制。</div>
		<div>4. gwt可以运行于任何web server, echo则需要传统的servlet容器。（意义不大，现在哪有静态网站啊，后台交互肯定还是需要的）</div>
		<div>5. echo2的客户端引擎通过ajax提交用户动作，对用户界面增量更新。</div>
		<div> </div>
		<div>性能：</div>
		<div>1. gwt的页面logic都在浏览器上，所以很快。但是如果需要和中间层交互，就会碰到同样的网络问题。</div>
		<div>2. echo2的代码跑在server上，所以所有的交互都需要反馈给server。echo2在设计上尽量减少这种交互，比如客户对文本的修改都是延迟发送到服务器,而服务器只发送页面的变化部分到浏览器。</div>
		<div>3. gwt应用被编译成一个页面，虽然应用的复杂化，这个编译结果也随之变得可怕。。。(个人认为随着编译器的发展，不同的页面可以做到lazy load)</div>
		<div>4. echo的js模块是lazy加载到浏览器的，界面上呈现哪些控件才去加载并且缓存对应的js模块。发送到客户端的不是逻辑代码，只有用户状态（个人认为echo2现在过于lazy，导致初始化阶段多次访问server加载一些基本的js模块，应该揉合到一起。另外，因为echo逻辑代码在服务器上，相对来说可以防止盗版）</div>
		<div> </div>
		<div>中间层和数据访问：</div>
		<div>1. 如果要访问数据，gwt还是要回到传统的模式，通过rpc访问servlet。gwt提供把远程服务透明的包装起来，中间传送pojo. 尽管包装了，中间的安全和和校验还是必须要开发者考虑。</div>
		<div>2. echo支持SOA，但是不必须。大多数情况下安全不是问题，因为数据和逻辑都不会暴露到浏览器上。(以前给echo提过建议，浏览器用户很可能去模拟一个被disabled按钮提交，这种问题现在无需考虑）</div>
		<div> </div>
		<div>运行环境：</div>
		<div>1. gwt运行在浏览器上，并非所有的java类都能编译成js.　gwt现在只支持java.lang/java.util下面的一个子集(版本 1.0.21)：27 classes, 11 interfaces, and 18 exception(这让人想起了j2me开发). 一些现有的类库就别想了。</div>
		<div> </div>
		<div>调试：</div>
		<div>1. gwt调试需要一套和运行时完全不同的环境：HOST模式，代码作为真正的java在运行。(个人认为这里因为是纯java调试，比echo的web调试要稍微方便一些。做单元测试也更方便些，但不是对最终browser的测试）</div>
		<div>2. echo调试就是传统的servlet调试。</div>
		<div> </div>
		<div>授权：</div>
		<div>1. gwt的api是开源的，编译器和host模式浏览器不公开。整体来说：free. （个人认为，如果要扩充gwt可能会遇到麻烦）</div>
		<div>2. echo2开源，mozilla public license. free(个人认为：echostudio也free就好了。nextapp毕竟要生存）</div>
		<div> </div>
		<div>应用：</div>
		<div>1. gwt可以嵌入传统的静态html, 也能作为一个完整应用。做大应用要考虑编译后的重量、本地化、库支持等问题（关于18n, 可以在gwt支持论坛上搜索i18n,似乎已经有方案）</div>
		<div>2. echo2成熟得可以适用各种应用，但是不能作为静态页面的一部分使用。（有点吹牛，在大访问量下，服务器的压力肯定不会小）</div>
		<div> </div>
		<div> </div>
		<div> </div>
		<div>
				<div>个人结论：<br />1. 开发方式都很优秀，用纯java开发b/s<br />2. gwt可用于大型网站，把压力转嫁给客户端。<br />3. echo可用于快速开发复杂的企业应用，把压力丢给服务器(企业里面最清闲的就是前台和服务器)<br /><br />两个产品都很优秀，GWT是2006年的IT飓风，波及后面几年。M$的日子要难过了, GOOGLE的确是个令人头痛的对手。<br /><div><br />然而，还有比gwt/echo2更美好的未来吗？</div><div>有！把他们的输出变成flash，用java开发flash应用。去年探索过一段时间，原型已经出来，因为flash开发调试太ugly, 没有继续下去。<br />另外，微软的WPF(AVALON)相当值得关注。<br /></div></div>
		</div>
<img src ="http://www.blogjava.net/steeven/aggbug/49502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steeven/" target="_blank">steeven</a> 2006-06-01 11:32 <a href="http://www.blogjava.net/steeven/archive/2006/06/01/49502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转贴：Comparing the Google Web Toolkit to Echo2 </title><link>http://www.blogjava.net/steeven/archive/2006/06/01/49379.html</link><dc:creator>steeven</dc:creator><author>steeven</author><pubDate>Wed, 31 May 2006 16:55:00 GMT</pubDate><guid>http://www.blogjava.net/steeven/archive/2006/06/01/49379.html</guid><wfw:comment>http://www.blogjava.net/steeven/comments/49379.html</wfw:comment><comments>http://www.blogjava.net/steeven/archive/2006/06/01/49379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/steeven/comments/commentRss/49379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steeven/services/trackbacks/49379.html</trackback:ping><description><![CDATA[
		<p>
				<a class="l" onmousedown="return clk(this.href,'','','res','3','&amp;sig2=pJ1Fot_su8h8uomh_vem5g')" href="http://code.google.com/webtoolkit/" target="_blank">
						<font color="#cc0033">Google Web Toolkit</font>
						<font color="#551a8b">
						</font>
				</a>虽然还是beta版本，和google的其他产品一样，刚出生就注定不凡，也许将影响后面几年的b/s开发。<br /><br />gwt利用了java开发的一切成熟条件，包括Unit test, refactor, IDE(eclipse...)，传统的b/s framework必将受到重创，横扫过后，JSF/ECHO等Server side framework可能幸存。如果哪天google加上serverside支持（从包命名上看是留有余地的）。。。虽然gwt目前还是小样一个，但是背后站的是重量级的google，强大的资源和数不完的银子。。。。<br /><br />看到这玩意首先想到的是echo2, 客户端技术都是ajax, 编码都是java. 不同的是gwt发行时编译成HTML+JS，Echo2则是完全的服务器端生成+更新。gwt跟server端交互依靠类似于ws的service把前后台完全区分开。<br /><br />在echo的论坛里面已经有人在讨论这玩意了，并且八卦了一下gwt的前身似乎是Morfik的一部分（待证实）<br />从原理上，echo的开发者作出了对比，这个网站似乎被封锁，这里转贴一下:<br /><br /><br />＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br /><a href="http://echotwo.blogspot.com/">http://echotwo.blogspot.com/</a> 作者tod liebeck<br /><br />Comparing the Google Web Toolkit to Echo2 <br />The Google Web Toolkit (GWT) is being compared to Echo2 quite frequently. Some of these comparisons have been fairly accurate, while others contain bits of misinformation. This article, written by the lead developer of Echo2, discusses the similarities and differences between these two frameworks.</p>
		<p>Overview</p>
		<p>The Google Web Toolkit and Echo2 definitely make for an interesting comparison. Both of these frameworks take a non-traditional approach toward web application development, even considering the latest crop of "AJAX-based frameworks" available today.</p>
		<p>The most obvious similarity between GWT and Echo2 is that they both enable the developer to create dynamic, AJAX-driven web user interfaces using only Java. In both projects, UIs are developed in a fashion similar to SWT or Swing: by assembling hierarchies of components and registering event handlers. Neither project requires the developer to work with HTML, JavaScript, or XML.</p>
		<p>The most obvious difference between GWT and Echo2 is that all of your GWT code is executed on the client, whereas your Echo2 code is executed on the server. There are advantages and disadvantages to both of these approaches, which will be highlighted throughout the article.</p>
		<p>GWT's defining attribute is the Java-to-JavaScript compiler. This compiler allows you to develop the web interface to your application in Java, then compile it to JavaScript. GWT limits the developer to a subset of the Java 1.4 libraries. GWT applications can be served by any web server, such as Apache, without the need for server-side processing.</p>
		<p>Echo2 applications are compiled to Java byte code and run on a Java server. Their Java code is executed by Echo2's "Web Application Container" layer, which sits atop a Java Servlet. On the web browser, the Echo2 "Client Engine" communicates user input to the Web Application Container via AJAX requests, with the server responding with directives to perform incremental updates to the state of the client web browser.</p>
		<p>User Interface Performance</p>
		<p>With GWT, all of your user interface code exists on the client browser. In operations that do not require server communication--that is, that do not require retrieving data from the middle tier--this configuration results in response times that are not dependent on the server. When data must be retrieved from the application's middle tier or business logic layer, the response time is subject to the same criteria as any other AJAX application, i.e., network latency, bandwidth, and server performance.</p>
		<p>Echo2 application code is run on the server, so for each user interaction that requires a call to the middle tier or immediate execution of the application's Java code, an AJAX connection is made to the server. Echo2 components are designed to minimize the client/server communication as much as is possible, limiting it to times when the server must be notified immediately of events. For example, simple events such as user input to a TextField component will not result in server contact. The server's response is the minimum set of instructions to incrementally update the client to reflect the new screen state.</p>
		<p>GWT applications are served to the client as a single HTML/JavaScript file, containing the entirety of the user interface. The size of this file will be proportional to the size of your user interface code and the toolkit libraries used by your application.</p>
		<p>Echo2 JavaScript modules are lazy-loaded to the client, and thereafter cached. A module will be retrieved when a component first appears on-screen that requires it. Application code is never sent to the client, only the state of the user interface.</p>
		<p>Middle Tier / Data Retrieval</p>
		<p>To access business data or perform a business process, a GWT user interface makes a remote procedure call (RPC) from the browser to a Servlet. GWT provides a mechanism to make the RPC invocation transparent to the developer, allowing the developer to build the application with "Plain Old Java Objects" (POJOs). However, any application that provides an RPC capability is a distributed application -- even when the RPC is accomplished transparently to the developer. Distributed applications in businesses and enterprises usually have security considerations and the remote objects serving the GWT clients must be designed with a focus on security to deflect attacks from imitated or hostile client applications.</p>
		<p>Echo2 applications support, but do not require, the use of distributed application logic or a Service Oriented Architecture (SOA). Alternatively, Echo2 applications can be built to run entirely within a single JVM instance, backed by a POJO-based middle tier. This allows Echo2 developers to build applications without the security concerns of distributed application logic -- and leverage the many strong frameworks built around POJO development such as the Spring Framework and Hibernate. Echo2 accomplishes this by keeping the state of a user's web interface on the server so that no remote objects need to be exposed.</p>
		<p>Run-time Environment</p>
		<p>GWT has some limitations due to the fact that applications are run on the client browser. First, GWT applications are limited to using a subset of the core Java class libraries, consisting of 27 classes, 11 interfaces, and 18 exception types found in the java.util and java.lang packages (as of GWT 1.0.21). This limitation prevents GWT applications from linking to most existing Java libraries. Additionally, all Java code must be compliant with the Java 1.4 specification; 1.5 is not supported. Localization-related portions of the Java API are not provided.</p>
		<p>Debugging</p>
		<p>GWT provides an alternate deployment environment for applications to facilitate debugging. The environment, called "Hosted Mode", allows a GWT application to be run as Java byte code in a local JVM, to which an IDE's debugger can be connected. In this mode, the application's user interface is displayed in a special web browser (a Mozilla/Firefox derivative).</p>
		<p>Echo2 applications may be debugged in the conventional manner, by connecting an IDE's debugger to a JVM running a Servlet container.</p>
		<p>Licensing</p>
		<p>The primary component of GWT, the Java-to-JavaScript cross-compiler, is proprietary, binary-only software. The Java API libraries are open source software, distributed under the Apache License. The API libraries have essentially no value without the proprietary compiler. The (non-critical) hosted-mode browser is also under the proprietary license. GWT is provided free of charge.</p>
		<p>Echo2 is open source software, licensed under the Mozilla Public License, and provided free of charge.</p>
		<p>Applicability</p>
		<p>GWT can be used as a means of creating AJAX components to embed in traditional web applications (or even in static web pages) as well as for creating complete application user interfaces. There are some issues to using it for the creation of large applications, where downloading an entire application to a client web browser in one shot would not be practical. The lack of localization and full Java API support also presents a problem for larger solutions.</p>
		<p>Echo2 is practical for creating web applications of any size. It is however not intended to scale downward to function as a platform for simply creating AJAX components in traditional web frameworks (or static web sites).</p>
		<p>More Information</p>
		<p>Google Web Toolkit:<br />Home Page, Example Applications, Getting Started Guide, Developer Guide</p>
		<p>Echo2:<br />Home Page, Example Applications, Tutorial <br />posted by Tod Liebeck at 5:13 AM | 0 comments  <br /><br />======================================<br />毕竟gwt还是小baby, 以后怎么发展还难说，现在下结论太早。这两天试用一下，有空从细节上对比一下。<br /></p>
<img src ="http://www.blogjava.net/steeven/aggbug/49379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steeven/" target="_blank">steeven</a> 2006-06-01 00:55 <a href="http://www.blogjava.net/steeven/archive/2006/06/01/49379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程使用SDO[EMF兄弟篇]</title><link>http://www.blogjava.net/steeven/archive/2006/05/15/46266.html</link><dc:creator>steeven</dc:creator><author>steeven</author><pubDate>Mon, 15 May 2006 11:00:00 GMT</pubDate><guid>http://www.blogjava.net/steeven/archive/2006/05/15/46266.html</guid><wfw:comment>http://www.blogjava.net/steeven/comments/46266.html</wfw:comment><comments>http://www.blogjava.net/steeven/archive/2006/05/15/46266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/steeven/comments/commentRss/46266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steeven/services/trackbacks/46266.html</trackback:ping><description><![CDATA[SDO，简单理解就是EMF的脱机版。类似于resultSet和DataSet。可用于smartclient等脱机数据加工场合。<br />主要特点：（个人理解）<br />可验证<br />强类型<br />可取出完整数据和差异。<br /><br />生成SDO代码和EMF大同小异，主要是在my.genmodel的第一个节点的右键菜单中选择：Set SDO defaults.<br /><br />体验：<br />1. 生成Editor后，执行生成的Editor Plugin<br />2. 新建Example EMF Model Creation Wizards-&gt;Data Graph Model<br />3. 在Changes节点上Start Loggin, 然后编辑数据即可看到自动生成的差异。<br /><br />网上手工操作SDO的示例代码比较少，这里简单demo如下：<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: #0000ff">import</span><span style="COLOR: #000000"> java.util.Iterator;<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><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.eclipse.emf.ecore.EObject;<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.emf.ecore.sdo.EDataGraph;<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.emf.ecore.sdo.SDOFactory;<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.steeven.family.FamilyFactory;<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.steeven.family.个人;<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.steeven.family.家庭;<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><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> commonj.sdo.ChangeSummary;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> commonj.sdo.DataGraph;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> commonj.sdo.DataObject;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_374_1937_Open_Image" onclick="this.style.display='none'; Codehighlighter1_374_1937_Open_Text.style.display='none'; Codehighlighter1_374_1937_Closed_Image.style.display='inline'; Codehighlighter1_374_1937_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_374_1937_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_374_1937_Closed_Text.style.display='none'; Codehighlighter1_374_1937_Open_Image.style.display='inline'; Codehighlighter1_374_1937_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"> Server </span><span id="Codehighlighter1_374_1937_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_374_1937_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_417_766_Open_Image" onclick="this.style.display='none'; Codehighlighter1_417_766_Open_Text.style.display='none'; Codehighlighter1_417_766_Closed_Image.style.display='inline'; Codehighlighter1_417_766_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_417_766_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_417_766_Closed_Text.style.display='none'; Codehighlighter1_417_766_Open_Image.style.display='inline'; Codehighlighter1_417_766_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_417_766_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_417_766_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> client side</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        EDataGraph graph </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> loadGraph();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        graph.getChangeSummary().beginLogging(); // important!<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        家庭 family </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (家庭) graph.getRootObject();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.setTitle(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">my family</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        个人 baby </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> FamilyFactory.INSTANCE.create个人();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        baby.set姓名(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sophie</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.get兔崽子().add(baby);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        graph.getChangeSummary().endLogging();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        saveGraph(graph);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        update(graph);<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" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">server side</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_822_1027_Open_Image" onclick="this.style.display='none'; Codehighlighter1_822_1027_Open_Text.style.display='none'; Codehighlighter1_822_1027_Closed_Image.style.display='inline'; Codehighlighter1_822_1027_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_822_1027_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_822_1027_Closed_Text.style.display='none'; Codehighlighter1_822_1027_Open_Image.style.display='inline'; Codehighlighter1_822_1027_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> EDataGraph loadGraph() </span><span id="Codehighlighter1_822_1027_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_822_1027_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        家庭 family </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> FamilyFactory.INSTANCE.create家庭(); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> or load from<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> database<img src="http://www.blogjava.net/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        EDataGraph graph </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> SDOFactory.eINSTANCE.createEDataGraph();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        graph.setERootObject((EObject) family);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> graph;<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" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">server side full save</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_1103_1151_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1103_1151_Open_Text.style.display='none'; Codehighlighter1_1103_1151_Closed_Image.style.display='inline'; Codehighlighter1_1103_1151_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1103_1151_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1103_1151_Closed_Text.style.display='none'; Codehighlighter1_1103_1151_Open_Image.style.display='inline'; Codehighlighter1_1103_1151_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </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"> saveGraph(EDataGraph graph) </span><span id="Codehighlighter1_1103_1151_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_1103_1151_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(graph.getRootObject());<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" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">server side update changed objects</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_1240_1935_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1240_1935_Open_Text.style.display='none'; Codehighlighter1_1240_1935_Closed_Image.style.display='inline'; Codehighlighter1_1240_1935_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1240_1935_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1240_1935_Closed_Text.style.display='none'; Codehighlighter1_1240_1935_Open_Image.style.display='inline'; Codehighlighter1_1240_1935_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </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"> update(DataGraph dataGraph) </span><span id="Codehighlighter1_1240_1935_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_1240_1935_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ChangeSummary changeSummary </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dataGraph.getChangeSummary();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (Iterator it </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> changeSummary.getChangedDataObjects().iterator(); it<br /><img id="Codehighlighter1_1395_1932_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1395_1932_Open_Text.style.display='none'; Codehighlighter1_1395_1932_Closed_Image.style.display='inline'; Codehighlighter1_1395_1932_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1395_1932_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1395_1932_Closed_Text.style.display='none'; Codehighlighter1_1395_1932_Open_Image.style.display='inline'; Codehighlighter1_1395_1932_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                .hasNext();) </span><span id="Codehighlighter1_1395_1932_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_1395_1932_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            DataObject changedObject </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (DataObject) it.next();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Update for </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> changedObject);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (Iterator settingIt </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> changeSummary.getOldValues(changedObject)<br /><img id="Codehighlighter1_1616_1928_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1616_1928_Open_Text.style.display='none'; Codehighlighter1_1616_1928_Closed_Image.style.display='inline'; Codehighlighter1_1616_1928_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1616_1928_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1616_1928_Closed_Text.style.display='none'; Codehighlighter1_1616_1928_Open_Image.style.display='inline'; Codehighlighter1_1616_1928_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                    .iterator(); settingIt.hasNext();) </span><span id="Codehighlighter1_1616_1928_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_1616_1928_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                ChangeSummary.Setting changeSetting </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (ChangeSummary.Setting) settingIt<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                        .next();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> (changed </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                        </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> changeSetting.getProperty().getName() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> from \</span><span style="COLOR: #000000">""<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">                        </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> changeSetting.getValue() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> to \</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                        </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> changedObject.get(changeSetting.getProperty())<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                        </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">"</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" /></span><span style="COLOR: #000000">            }</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/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>输出：<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: #000000">org.steeven.family.impl.家庭Impl@9664a1 (title: my family)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Update for org.steeven.family.impl.个人Impl@1729854 (姓名: sophie, 性别: 男)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Update for org.steeven.family.impl.家庭Impl@9664a1 (title: my family)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> (changed title from "null" to "my family")<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> (changed 兔崽子 from "[]" to "[org.steeven.family.impl.个人Impl@1729854 (姓名: sophie, 性别: 男)]")<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />SDO生成的代码似乎更加纯净一点，没有很多的eXxxx()方法（有需要的也可以取到）。<br />据说log的开销比较大，不建议对大量数据使用。<img src ="http://www.blogjava.net/steeven/aggbug/46266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steeven/" target="_blank">steeven</a> 2006-05-15 19:00 <a href="http://www.blogjava.net/steeven/archive/2006/05/15/46266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMF编程使用</title><link>http://www.blogjava.net/steeven/archive/2006/05/14/46129.html</link><dc:creator>steeven</dc:creator><author>steeven</author><pubDate>Sun, 14 May 2006 13:27:00 GMT</pubDate><guid>http://www.blogjava.net/steeven/archive/2006/05/14/46129.html</guid><wfw:comment>http://www.blogjava.net/steeven/comments/46129.html</wfw:comment><comments>http://www.blogjava.net/steeven/archive/2006/05/14/46129.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/steeven/comments/commentRss/46129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steeven/services/trackbacks/46129.html</trackback:ping><description><![CDATA[
		<p>看到eclipse3.2里面的GMF, 觉得比较有趣,底层还是用到了EMF. 花了两天时间仔细研究了以下EMF,的确是个好东西. <br /><br />EMF根据ecore建模(可以和schema的xsd相互转换)生成强类型的EMF代码. 这个强类型更强的地方是可以取得meta信息,从而可以用于校验和界面辅助信息的生成.类似于动态bean,属性也可以根据名称动态取得.<br /><br />以前考虑过用xsd描述界面, 但是数据载体只能是xml, 即使利用apache的schema编译工具生成强类型的类,后台代码也是xml. 不利于持久化. emf在代码生成引擎比较智能,可以标记出用户代码和自动生成代码.不会有生成覆盖问题.<br /><br />这里做个简单示例:<br />1. Ecore:<br />可以新建Ecore, 建立好以后用GMF可视化编辑(Eclipse3.2RC2)<br /><img src="http://www.blogjava.net/images/blogjava_net/steeven/11114/o_emf_family.JPG" /><br />2. 生成Model:<br />点击my.ecore文件,菜单:File-&gt;New-&gt;Other-&gt;Eclipse Modeling Framework-&gt;EMF Model<br />3. 打开生成的my.genmodel, 选择树顶点的:Generate Model Code<br />生成的代码里面会有一个编译错误. 是中文编程的问题, 中文没有大小写(先天不足啊),结果性别这个成员变量和性别类名混淆,出错.在错误代码前面加上包全名即可.<br />4. 利用生成的代码构建一个家庭,输出xml并且校验之:</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">import</span>
				<span style="COLOR: #000000"> java.io.IOException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.Iterator;<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>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> org.eclipse.emf.common.util.Diagnostic;<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.emf.common.util.URI;<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.emf.ecore.EObject;<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.emf.ecore.resource.Resource;<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.emf.ecore.util.Diagnostician;<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.emf.ecore.xmi.XMLResource;<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.emf.ecore.xmi.impl.XMLResourceImpl;<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.steeven.family.FamilyFactory;<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.steeven.family.人物;<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.steeven.family.家庭;<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.steeven.family.性别;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_531_2101_Open_Image" onclick="this.style.display='none'; Codehighlighter1_531_2101_Open_Text.style.display='none'; Codehighlighter1_531_2101_Closed_Image.style.display='inline'; Codehighlighter1_531_2101_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_531_2101_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_531_2101_Closed_Text.style.display='none'; Codehighlighter1_531_2101_Open_Image.style.display='inline'; Codehighlighter1_531_2101_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"> TestMy </span>
				<span id="Codehighlighter1_531_2101_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_531_2101_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_593_612_Open_Image" onclick="this.style.display='none'; Codehighlighter1_593_612_Open_Text.style.display='none'; Codehighlighter1_593_612_Closed_Image.style.display='inline'; Codehighlighter1_593_612_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_593_612_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_593_612_Closed_Text.style.display='none'; Codehighlighter1_593_612_Open_Image.style.display='inline'; Codehighlighter1_593_612_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 style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> IOException </span>
						<span id="Codehighlighter1_593_612_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_593_612_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        testFamily();<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" />
								<br />
								<img id="Codehighlighter1_668_1136_Open_Image" onclick="this.style.display='none'; Codehighlighter1_668_1136_Open_Text.style.display='none'; Codehighlighter1_668_1136_Closed_Image.style.display='inline'; Codehighlighter1_668_1136_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_668_1136_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_668_1136_Closed_Text.style.display='none'; Codehighlighter1_668_1136_Open_Image.style.display='inline'; Codehighlighter1_668_1136_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">private</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"> testFamily() </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> IOException </span>
						<span id="Codehighlighter1_668_1136_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_668_1136_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        家庭 family </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> FamilyFactory.eINSTANCE.create家庭();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.setTitle(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">steeven家</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.set老公(FamilyFactory.eINSTANCE.create人物());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.get老公().set姓名(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">steeven</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.set老婆(FamilyFactory.eINSTANCE.create人物());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.get老婆().set姓名(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">stella</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.get老婆().set性别(性别.女_LITERAL);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        人物 sophie </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> FamilyFactory.eINSTANCE.create人物();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        sophie.set姓名(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">sophie</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        sophie.set性别(性别.女_LITERAL);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        family.get兔崽子().add(sophie);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        dump(family);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        validate(family);<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" />
								<br />
								<img id="Codehighlighter1_1185_1455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1185_1455_Open_Text.style.display='none'; Codehighlighter1_1185_1455_Closed_Image.style.display='inline'; Codehighlighter1_1185_1455_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1185_1455_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1185_1455_Closed_Text.style.display='none'; Codehighlighter1_1185_1455_Open_Image.style.display='inline'; Codehighlighter1_1185_1455_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">private</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"> validate(EObject family) </span>
						<span id="Codehighlighter1_1185_1455_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_1185_1455_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Diagnostic diagnostic </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> Diagnostician.INSTANCE.validate(family);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(diagnostic);<br /><img id="Codehighlighter1_1361_1452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1361_1452_Open_Text.style.display='none'; Codehighlighter1_1361_1452_Closed_Image.style.display='inline'; Codehighlighter1_1361_1452_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1361_1452_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1361_1452_Closed_Text.style.display='none'; Codehighlighter1_1361_1452_Open_Image.style.display='inline'; Codehighlighter1_1361_1452_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">for</span>
								<span style="COLOR: #000000"> (Iterator it </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> diagnostic.getChildren().iterator(); it.hasNext();) </span>
								<span id="Codehighlighter1_1361_1452_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_1361_1452_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            Diagnostic diag </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> (Diagnostic) it.next();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.println(diag.getMessage());<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" />
								<br />
								<img id="Codehighlighter1_1524_2099_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1524_2099_Open_Text.style.display='none'; Codehighlighter1_1524_2099_Closed_Image.style.display='inline'; Codehighlighter1_1524_2099_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1524_2099_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1524_2099_Closed_Text.style.display='none'; Codehighlighter1_1524_2099_Open_Image.style.display='inline'; Codehighlighter1_1524_2099_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> Resource dump(EObject<img src="http://www.blogjava.net/images/dot.gif" /> objs) </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> IOException </span>
						<span id="Codehighlighter1_1524_2099_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_1524_2099_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> ResourceSet rs = new ResourceSetImpl();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put(<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> Resource.Factory.Registry.DEFAULT_EXTENSION,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> new XMIResourceFactoryImpl());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> Resource resource = rs.createResource(URI<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> .createFileURI("c:\\temp\\test.xml"));</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        XMLResource resource </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> XMLResourceImpl(URI<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                .createFileURI(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">c:\\temp\\test.xml</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        resource.setEncoding(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">GBK</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">for</span>
								<span style="COLOR: #000000"> (EObject obj : objs)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            resource.getContents().add(obj); </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 目前版本不加入resource验证会报singling异常</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        resource.save(System.out, </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">return</span>
								<span style="COLOR: #000000"> resource;<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>运行结果如下:<br /><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: #0000ff">&lt;?</span>
				<span style="COLOR: #ff00ff">xml version="1.0" encoding="GBK"</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">family:</span>
				<span style="COLOR: #ff0000">家庭 xmlns:family</span>
				<span style="COLOR: #0000ff">="http://org.steeven/family"</span>
				<span style="COLOR: #ff0000"> title</span>
				<span style="COLOR: #0000ff">="steeven家"</span>
				<span style="COLOR: #ff0000"> 老公</span>
				<span style="COLOR: #0000ff">="/"</span>
				<span style="COLOR: #ff0000"> 老婆</span>
				<span style="COLOR: #0000ff">="/"</span>
				<span style="COLOR: #ff0000"> 兔崽子</span>
				<span style="COLOR: #0000ff">="/"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Diagnostic ERROR <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />The feature '老公' of 'org.steeven.family.impl.家庭Impl@f6a746{file:/c:/temp/test.xml#/}' contains a dangling reference 'org.steeven.family.impl.人物Impl@6eb38a{#//}'<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />The feature '老婆' of 'org.steeven.family.impl.家庭Impl@f6a746{file:/c:/temp/test.xml#/}' contains a dangling reference 'org.steeven.family.impl.人物Impl@1cd2e5f{#//}'<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />The feature '兔崽子' of 'org.steeven.family.impl.家庭Impl@f6a746{file:/c:/temp/test.xml#/}' contains a dangling reference 'org.steeven.family.impl.人物Impl@19f953d{#//}'<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<br />可见输出的xml中没有包含人物的具体信息. 修改my.ecore中老公/老婆/兔崽子属性的containment属性为true,重新生成代码后运行结果如下:<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: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="GBK"</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">family:</span><span style="COLOR: #ff0000">家庭 xmlns:family</span><span style="COLOR: #0000ff">="http://org.steeven/family"</span><span style="COLOR: #ff0000"> title</span><span style="COLOR: #0000ff">="steeven家"</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">老公 姓名="steeven</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">老婆 性别="女" 姓名="stella</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">兔崽子 性别="女" 姓名="sophie</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">family:家庭</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Diagnostic OK</span></div><br /><br />====================<br />EMF单独运行成功~ <br /><br />这里ECORE似乎不支持嵌套定义,不像schema那样一个complexType声明里面可以定义的很复杂, 也不像Java的内部类. 似乎被作了简化, 更像关系数据库表之间的关系. <br /><br />待求证问题:<br />1. EMF的校验信息是否支持国际化.<br />2. EMF数据的能否更方便的保存到数据.<br /><br />EMF的灵活和强大已经验证过, 用于C/S还是B/S应该都不是问题. <br /><img src ="http://www.blogjava.net/steeven/aggbug/46129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steeven/" target="_blank">steeven</a> 2006-05-14 21:27 <a href="http://www.blogjava.net/steeven/archive/2006/05/14/46129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java版2006新春祝福</title><link>http://www.blogjava.net/steeven/archive/2006/01/12/27697.html</link><dc:creator>steeven</dc:creator><author>steeven</author><pubDate>Thu, 12 Jan 2006 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/steeven/archive/2006/01/12/27697.html</guid><wfw:comment>http://www.blogjava.net/steeven/comments/27697.html</wfw:comment><comments>http://www.blogjava.net/steeven/archive/2006/01/12/27697.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/steeven/comments/commentRss/27697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steeven/services/trackbacks/27697.html</trackback:ping><description><![CDATA[<P>偶msn名字是：Year y2006 = /*happy*/ new Year(2006);<BR>一个朋友受到启发，给偶写了一段祝福代码，稍微改编一下送给大家</P>
<P></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 id=Codehighlighter1_70_162_Open_Image onclick="this.style.display='none'; Codehighlighter1_70_162_Open_Text.style.display='none'; Codehighlighter1_70_162_Closed_Image.style.display='inline'; Codehighlighter1_70_162_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_70_162_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_162_Closed_Text.style.display='none'; Codehighlighter1_70_162_Open_Image.style.display='inline'; Codehighlighter1_70_162_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(Blogger&nbsp;blogger&nbsp;:&nbsp;&nbsp;BlogFarm.getInstance[</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">BlogJava</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">].getBloggers())</SPAN><SPAN id=Codehighlighter1_70_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_70_162_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;blogger.setHealth(</SPAN><SPAN style="COLOR: #000000">Health.good);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;blogger.getFamily().setHappy(blogger.getFamily().getHappy()&nbsp;</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/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;blogger.setMoney(blogger.getMoney&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">10)</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV>
<P>备注：<BR>1.未单元测试<BR>2. 感觉不如<A href="http://www.cnblogs.com/steeven/archive/2006/01/12/315847.html">c#版新春祝福</A>优雅一些<BR></P><img src ="http://www.blogjava.net/steeven/aggbug/27697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steeven/" target="_blank">steeven</a> 2006-01-12 11:33 <a href="http://www.blogjava.net/steeven/archive/2006/01/12/27697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>奢谈未来的java语言。。。 </title><link>http://www.blogjava.net/steeven/archive/2005/12/29/25904.html</link><dc:creator>steeven</dc:creator><author>steeven</author><pubDate>Thu, 29 Dec 2005 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/steeven/archive/2005/12/29/25904.html</guid><wfw:comment>http://www.blogjava.net/steeven/comments/25904.html</wfw:comment><comments>http://www.blogjava.net/steeven/archive/2005/12/29/25904.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/steeven/comments/commentRss/25904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steeven/services/trackbacks/25904.html</trackback:ping><description><![CDATA[<P>Java是个扶不起的阿斗，sun在赢了微软的官司以后似乎在忙于分红，相对于红红火火的.net世界，sun几乎在坐以待毙，浪费无数开源爱好者的感情。<BR><A href="http://www.matrix.org.cn/resource/news/389_2005+Java.html">matrix展望2006的java</A>，似乎只能看到开源爱好者的一腔热血。<BR><BR>未来的java应该是什么样子呢？下面是我期望：&nbsp;<BR><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 id=Codehighlighter1_1_118_Open_Image onclick="this.style.display='none'; Codehighlighter1_1_118_Open_Text.style.display='none'; Codehighlighter1_1_118_Closed_Image.style.display='inline'; Codehighlighter1_1_118_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1_118_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1_118_Closed_Text.style.display='none'; Codehighlighter1_1_118_Open_Image.style.display='inline'; Codehighlighter1_1_118_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 id=Codehighlighter1_1_118_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_1_118_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;1.&nbsp;空指针抑制&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;JVM支持的Runtime空指针抑制，根据方法的[Nullable]标记&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;java里面有太多的NullPointer异常，经常需要复杂的检测，浪费没必要的代码。<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&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>&nbsp;&nbsp;&nbsp;&nbsp;[Nullable]<BR><IMG id=Codehighlighter1_162_208_Open_Image onclick="this.style.display='none'; Codehighlighter1_162_208_Open_Text.style.display='none'; Codehighlighter1_162_208_Closed_Image.style.display='inline'; Codehighlighter1_162_208_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_162_208_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_162_208_Closed_Text.style.display='none'; Codehighlighter1_162_208_Open_Image.style.display='inline'; Codehighlighter1_162_208_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;testNullable(A&nbsp;a)</SPAN><SPAN id=Codehighlighter1_162_208_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_208_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;a.b().c.d();&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">如果用if&nbsp;else写需要多少代码？</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_213_311_Open_Image onclick="this.style.display='none'; Codehighlighter1_213_311_Open_Text.style.display='none'; Codehighlighter1_213_311_Closed_Image.style.display='inline'; Codehighlighter1_213_311_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_213_311_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_311_Closed_Text.style.display='none'; Codehighlighter1_213_311_Open_Image.style.display='inline'; Codehighlighter1_213_311_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_213_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_213_311_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;2.&nbsp;动态属性支持&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;类似范型的实现，由编译器支持即可。&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@param</SPAN><SPAN style="COLOR: #008000">&nbsp;a:&nbsp;A&nbsp;implements&nbsp;DynamicBean,没有定义c属性<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_346_742_Open_Image onclick="this.style.display='none'; Codehighlighter1_346_742_Open_Text.style.display='none'; Codehighlighter1_346_742_Closed_Image.style.display='inline'; Codehighlighter1_346_742_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_346_742_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_346_742_Closed_Text.style.display='none'; Codehighlighter1_346_742_Open_Image.style.display='inline'; Codehighlighter1_346_742_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;dynamicProperty(A&nbsp;a)</SPAN><SPAN id=Codehighlighter1_346_742_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_346_742_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">assert</SPAN><SPAN style="COLOR: #000000">&nbsp;a&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.b.c&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abc</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">等效于a.getProperty("b").setProperty("c","abc");</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;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">for&nbsp;database:</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;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;rs.name;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">if&nbsp;ResultSet&nbsp;defined&nbsp;getStringProperty():&nbsp;String&nbsp;name&nbsp;=&nbsp;rs.getStringProperty("a");</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;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;order;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">for&nbsp;xml,&nbsp;element&nbsp;auto-created&nbsp;in&nbsp;getProperty()&nbsp;method.</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;&nbsp;&nbsp;&nbsp;&nbsp;order.address.phone&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">1234</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">order.getProperty("address").setProperty("phone","1234");</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_749_843_Open_Image onclick="this.style.display='none'; Codehighlighter1_749_843_Open_Text.style.display='none'; Codehighlighter1_749_843_Closed_Image.style.display='inline'; Codehighlighter1_749_843_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_749_843_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_749_843_Closed_Text.style.display='none'; Codehighlighter1_749_843_Open_Image.style.display='inline'; Codehighlighter1_749_843_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_749_843_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_749_843_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;3.&nbsp;动态方法支持&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;由编译器支持即可。&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@param</SPAN><SPAN style="COLOR: #008000">&nbsp;a:&nbsp;A&nbsp;implements&nbsp;DynamicInvoke,没有定义b()方法<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_876_933_Open_Image onclick="this.style.display='none'; Codehighlighter1_876_933_Open_Text.style.display='none'; Codehighlighter1_876_933_Closed_Image.style.display='inline'; Codehighlighter1_876_933_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_876_933_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_876_933_Closed_Text.style.display='none'; Codehighlighter1_876_933_Open_Image.style.display='inline'; Codehighlighter1_876_933_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;dynamicMethod(A&nbsp;a)</SPAN><SPAN id=Codehighlighter1_876_933_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_876_933_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;a.b(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">x</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">编译为a.invoke("b",new&nbsp;Object[]{1,"x"]);</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_938_1016_Open_Image onclick="this.style.display='none'; Codehighlighter1_938_1016_Open_Text.style.display='none'; Codehighlighter1_938_1016_Closed_Image.style.display='inline'; Codehighlighter1_938_1016_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_938_1016_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_938_1016_Closed_Text.style.display='none'; Codehighlighter1_938_1016_Open_Image.style.display='inline'; Codehighlighter1_938_1016_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_938_1016_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_938_1016_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;4.&nbsp;快速反射&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;由编译器支持即可。便于编译期间错误检查&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@param</SPAN><SPAN style="COLOR: #008000">&nbsp;a:&nbsp;A&nbsp;定义了b(),c变量<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_1050_1249_Open_Image onclick="this.style.display='none'; Codehighlighter1_1050_1249_Open_Text.style.display='none'; Codehighlighter1_1050_1249_Closed_Image.style.display='inline'; Codehighlighter1_1050_1249_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1050_1249_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1050_1249_Closed_Text.style.display='none'; Codehighlighter1_1050_1249_Open_Image.style.display='inline'; Codehighlighter1_1050_1249_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;fastReflection(A&nbsp;a)</SPAN><SPAN id=Codehighlighter1_1050_1249_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_1050_1249_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;Annotation[]&nbsp;mas&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;a.b().</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">.getAnnotations();&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">a.getClass().getMethod("b").getAnnotations();</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;&nbsp;&nbsp;&nbsp;&nbsp;Annotation[]&nbsp;mas&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;a.c.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">.getAnnotations();&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;a.getClass().getField("c").getAnnotations();</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_1254_1341_Open_Image onclick="this.style.display='none'; Codehighlighter1_1254_1341_Open_Text.style.display='none'; Codehighlighter1_1254_1341_Closed_Image.style.display='inline'; Codehighlighter1_1254_1341_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1254_1341_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1254_1341_Closed_Text.style.display='none'; Codehighlighter1_1254_1341_Open_Image.style.display='inline'; Codehighlighter1_1254_1341_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1254_1341_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_1254_1341_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;5.&nbsp;索引器&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;类似.net的索引器，语法简洁。编译期间支持即可&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@param</SPAN><SPAN style="COLOR: #008000">&nbsp;a:&nbsp;A&nbsp;实现了List接口，Map接口<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_1371_1511_Open_Image onclick="this.style.display='none'; Codehighlighter1_1371_1511_Open_Text.style.display='none'; Codehighlighter1_1371_1511_Closed_Image.style.display='inline'; Codehighlighter1_1371_1511_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1371_1511_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1371_1511_Closed_Text.style.display='none'; Codehighlighter1_1371_1511_Open_Image.style.display='inline'; Codehighlighter1_1371_1511_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;indexVisit(A&nbsp;a)</SPAN><SPAN id=Codehighlighter1_1371_1511_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_1371_1511_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;Element&nbsp;order&nbsp;;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">xml&nbsp;element</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;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;first&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;order[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">];&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">order.get(0);</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;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;address&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;order[</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">address</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">];&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">order.get("address")</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_1515_1610_Open_Image onclick="this.style.display='none'; Codehighlighter1_1515_1610_Open_Text.style.display='none'; Codehighlighter1_1515_1610_Closed_Image.style.display='inline'; Codehighlighter1_1515_1610_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1515_1610_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1515_1610_Closed_Text.style.display='none'; Codehighlighter1_1515_1610_Open_Image.style.display='inline'; Codehighlighter1_1515_1610_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1515_1610_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_1515_1610_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;6.&nbsp;AOP&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;JVM内置支持AOP标记&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Trace是用户自行定制的Attribute,&nbsp;Trace.Interceptor指定拦截器&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&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>&nbsp;&nbsp;&nbsp;&nbsp;[Trace]<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[Role(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">admin</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)][Transactional]<BR><IMG id=Codehighlighter1_1677_1683_Open_Image onclick="this.style.display='none'; Codehighlighter1_1677_1683_Open_Text.style.display='none'; Codehighlighter1_1677_1683_Closed_Image.style.display='inline'; Codehighlighter1_1677_1683_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1677_1683_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1677_1683_Closed_Text.style.display='none'; Codehighlighter1_1677_1683_Open_Image.style.display='inline'; Codehighlighter1_1677_1683_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;jvmAOP(A&nbsp;a)</SPAN><SPAN id=Codehighlighter1_1677_1683_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_1677_1683_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;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_1688_1779_Open_Image onclick="this.style.display='none'; Codehighlighter1_1688_1779_Open_Text.style.display='none'; Codehighlighter1_1688_1779_Closed_Image.style.display='inline'; Codehighlighter1_1688_1779_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1688_1779_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1688_1779_Closed_Text.style.display='none'; Codehighlighter1_1688_1779_Open_Image.style.display='inline'; Codehighlighter1_1688_1779_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1688_1779_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_1688_1779_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;7.&nbsp;条件编译&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;编译器支持Condition标记,可以用于所有元素，甚至package&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;用于测试期间、调试期间编译出不同的结果<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&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>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_1784_1822_Open_Image onclick="this.style.display='none'; Codehighlighter1_1784_1822_Open_Text.style.display='none'; Codehighlighter1_1784_1822_Closed_Image.style.display='inline'; Codehighlighter1_1784_1822_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1784_1822_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1784_1822_Closed_Text.style.display='none'; Codehighlighter1_1784_1822_Open_Image.style.display='inline'; Codehighlighter1_1784_1822_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1784_1822_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_1784_1822_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;8.&nbsp;Schema，DataBase编译支持&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_1860_1955_Open_Image onclick="this.style.display='none'; Codehighlighter1_1860_1955_Open_Text.style.display='none'; Codehighlighter1_1860_1955_Closed_Image.style.display='inline'; Codehighlighter1_1860_1955_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1860_1955_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1860_1955_Closed_Text.style.display='none'; Codehighlighter1_1860_1955_Open_Image.style.display='inline'; Codehighlighter1_1860_1955_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;schemaSupport()&nbsp;</SPAN><SPAN id=Codehighlighter1_1860_1955_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_1860_1955_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;[Schema(url</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">file://test.xsd</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;Document&nbsp;doc;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;c&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;doc.a.b.c;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">根据schema编译期间检查</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_1960_1999_Open_Image onclick="this.style.display='none'; Codehighlighter1_1960_1999_Open_Text.style.display='none'; Codehighlighter1_1960_1999_Closed_Image.style.display='inline'; Codehighlighter1_1960_1999_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1960_1999_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1960_1999_Closed_Text.style.display='none'; Codehighlighter1_1960_1999_Open_Image.style.display='inline'; Codehighlighter1_1960_1999_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1960_1999_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_1960_1999_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;9.&nbsp;内置对象数据库，支持类似记忆的遗忘模式以节省空间<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_2031_2066_Open_Image onclick="this.style.display='none'; Codehighlighter1_2031_2066_Open_Text.style.display='none'; Codehighlighter1_2031_2066_Closed_Image.style.display='inline'; Codehighlighter1_2031_2066_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_2031_2066_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2031_2066_Closed_Text.style.display='none'; Codehighlighter1_2031_2066_Open_Image.style.display='inline'; Codehighlighter1_2031_2066_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;databaseSupport()</SPAN><SPAN id=Codehighlighter1_2031_2066_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_2031_2066_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;Database.</SPAN><SPAN style="COLOR: #0000ff">default</SPAN><SPAN style="COLOR: #000000">.find(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_2071_2155_Open_Image onclick="this.style.display='none'; Codehighlighter1_2071_2155_Open_Text.style.display='none'; Codehighlighter1_2071_2155_Closed_Image.style.display='inline'; Codehighlighter1_2071_2155_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_2071_2155_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2071_2155_Closed_Text.style.display='none'; Codehighlighter1_2071_2155_Open_Image.style.display='inline'; Codehighlighter1_2071_2155_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2071_2155_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">/**&nbsp;*/</SPAN><SPAN id=Codehighlighter1_2071_2155_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;10.&nbsp;平台支持&lt;br&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;编写windows的服务，调用windows的注册表/log/ad/schedule/菜单、工具条、桌面。。。<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_2187_2228_Open_Image onclick="this.style.display='none'; Codehighlighter1_2187_2228_Open_Text.style.display='none'; Codehighlighter1_2187_2228_Closed_Image.style.display='inline'; Codehighlighter1_2187_2228_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_2187_2228_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2187_2228_Closed_Text.style.display='none'; Codehighlighter1_2187_2228_Open_Image.style.display='inline'; Codehighlighter1_2187_2228_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;platformSupport()</SPAN><SPAN id=Codehighlighter1_2187_2228_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_2187_2228_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;PlatformRegistry.getString(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/dot.gif">.</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P><BR><BR>希望sun早日把java捐赠到开源社区，象eclipse一样焕发青春。 </P><img src ="http://www.blogjava.net/steeven/aggbug/25904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steeven/" target="_blank">steeven</a> 2005-12-29 17:01 <a href="http://www.blogjava.net/steeven/archive/2005/12/29/25904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>