<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>pedestrian_I</title>
    <description>坚持是种信仰,优秀是种习惯</description>
    <link>http://pedestrian-i.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>实习一个月</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/39280" style="color:red;">http://pedestrian-i.javaeye.com/blog/39280</a>&nbsp;
          发表时间: 2006年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>11月13号进的公司，转眼就已经实习了一个月了。感觉时间过的真快啊，生活就那么平凡的过着。得到什么失去什么？为什么做或者为什么不做？总是找不到自己的答案&hellip;&hellip;</p>
<p>不想这些沉重的东西了，还是说说实习。公司待遇管理上都给我不错的印象，刚来那会，大家都小心翼翼，生怕说错什么做错什么。经理分配什么都老老实实的埋头去做，发言少，圈子还是定在我们几个实习生当中。现在好很多，至少和经理说说笑，可以问一些问题，询问一下知识盲点。</p>
<p>分配在erp，结果三楼erp部没位置给我们坐，只好调到二楼的erp分部，混在测试部当中。每天都是bug充耳，电话不断。测试部的工作热情相对其他部门是要高昂很多的，特别是有个MM，每天都能听到她跟同事&ldquo;争吵&rdquo;的声音，有时候累了坐着喝茶听听他们在争论些什么，也同时提醒自己，写烂代码可是要被人骂的。后面的几位GG就没那么激情了，虽然偶尔也会凑一起吹吹水，谈谈NBA、电影电视的，但是大部分时间还是在讨论工作，很勤快啊。相对来说我们就闲多了，大概也是因为压力不足吧，任务太轻了。</p>
<p>实习至今分三个阶段，还稍微转了下行。刚进那阵是erp副经理辅导我们，任务是学习delphi，公司以前的软件大部分是delphi做的，现在也还有些还在用，所以要进公司就要学习delphi，然后经理给了我们几份资料，交代了下学习重点，我们就开始学习delphi。delphi看了两周，了解了object pascal的语法，熟悉delphi7工具、基于数据库控件的开发，com、com+组件的应用，ActiveX控件。总体感觉来说，delphi是一个很不错的工具，object pascal是对象化的pascal语言，有些地方还是挺有意思的，delphi 7工具就有些像VB，但是它要比VB更强大，对底层的支持要好。基于数据库控件的开发非常快，建立好数据源，拖几个控件就可以完成大部分功能。说delphi是C/S开发的王者，绝无虚言。</p>
<p>大概了解了delphi之后，经理分配的任务是给公司做一个项目编译系统，属于软件管理配置范畴，公司现有一个delphi版本，现在想升级到web版本，可能也是考虑到我们几个在web开发上有些实践经验。经理讲了大概的需求，我们4个就先确定目标是什么？理解用户的需求是什么？分析了之后再向经理汇报，询问，探究，以便确认真正需求。并且看了一下公司的delphi版本，也算是原型吧，能够确认功能模块、模块关系等。小组终于有了比较完整的了解，就开始制订计划，分工。首先是需求的确定，根据需求画出用例图，写需求文档，同时有一个人负责把大概的界面绘制出来。经理给我们指导了整体构建图，在这方面的抽象我们还是缺乏功力的。</p>
<p>一切都准备就绪，开始动手的时候，转折点来了。部门经理在我们进入公司的第三周，终于记得我们的存在并且要对我们安排计划了。把我们叫过去办公室，说只要表现好，公司还是期望你们留在这里的，所以就不要总是认为仅仅是实习。随后就介绍了一位牛人给我们认识，公司的DBA周经理，可能是公司在oracle数据库管理和开发上比较缺人，于是部门经理就把我们安排过去了。主要做的工作有两个方向，一个是DBA，一个是DA（数据建模），一个是纯技术，一个是偏业务。周经理说至少要一年的培养，才可以胜任重任。数据库博大精深，一年能做起来我已经觉得很了不起了。不过公司做出这样的决定也看出公司并不是把我们看做只是在这里实习的学生，而是以公司以后的员工来培养了。还是感到很欣慰的。只要好好干，总会有出头日的。</p>
<p>无论是DBA还是DA，都是要学基础的。oracle一直想涉及但是一直没动，sql server、mysql用过。周经理比较忙，常常看到他来去匆匆，说话很快，思维很敏捷。先给我们一份资料叫我们学习oracle基础，了解体系结构，大概知道它是怎么回事。仅仅他给的资料还是不够的，自己找了一堆资料看，安装配置好oracle服务器，然后就开始了oracle的学习。突然发现每天用的最多的应用程序是cmd...oms也用，但是还是觉得没cmd好使，自带的sql*plus也诸多限制。后来才发现PL/SQL developer，那是后话。</p>
<p>oracle体系结构，oracle管理、数据字典动态视图、日志、备份恢复、PL/SQL&hellip;&hellip;喝茶、厕所、讨论、吹水&hellip;&hellip;</p>
<p>这样就过去两周，期间想去找周经理讨点任务做，结果发现他出差了。没法子，还是继续自己研究。不到两周的时间内，看了不少教程也试验了一把，发现oralce真的是博大精深，复杂严紧，比sql server强大很多，特别是在安全这一块，做了大量的工作，用户、权限、口令文件、重做日志、归档日志、冷备份、热备份、完全备份、不完全备份、完全恢复、不完全恢复&hellip;&hellip;不断的试验，不断的写procedure/function，熟悉oracle sql的内部函数，很有用处。写着这些过程化的程序，突然发现，java是多么的简单啊。</p>
<p>等周经理回来，实习也是到了另外一个转折点。终于有点事做了，虽然工作不是很难，但是挺复杂。字符串处理能力要求高、对数据字典动态视图非常熟悉、对sql命令要熟练，比如说创建表create table，它的语法是怎样的。看似很简单，其实并不简单，我们之前建表只是给定对象、表名、列名、约束、索引，这些是常用的参数，还有一些不常用的参数，比如块大小，最大事务最小事务、最大数据量等等的设定，select * from user_tables，你将会看到一大堆的字段。处理的任务就是将数据库创建表、索引、视图、过程函数的sql脚本从数据库中导出，并且以良好的格式，这个良好的格式需求真的棘手，也就是相当于要eclipse里面的crtl+shift+f的排版效果，不好弄。尽快将任务做完提交。</p>
<p>一个月就这样过去了，下个月会面临什么呢？</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/39280#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Dec 2006 02:26:51 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/39280</link>
        <guid>http://pedestrian-i.javaeye.com/blog/39280</guid>
      </item>
      <item>
        <title>Re: 你们的梦想是什么?</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/35969" style="color:red;">http://pedestrian-i.javaeye.com/blog/35969</a>&nbsp;
          发表时间: 2006年11月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>对于梦想这个词，以前感觉它很柔弱很飘渺，想抓住挥舞着手却总是捞了个空</p>
<p>有时候会觉得它很可笑，每当看到别人口口声声说我要怎样怎样努力，成为怎样怎样了不起的人物，激情过后却依然过着不甘心的平凡</p>
<p>偶尔觉得它很伟大，因为看到真正为梦想永不松懈奋斗的人很可敬，心神向往，斗志昂扬，早已在肚皮底下的梦想油然升起，激情一段</p>
<p>人是很脆弱的，很多情绪，情绪的不定给我们不同的梦想，年轻的时候对生活徘徊不定，路途曲折却不知择何路而行，思想杂乱却不知意志何向&hellip;&hellip;我想当我不再年轻，却已经迈不开步子，身上缠绕着无数的羁绊，责任成为逃避梦想的借口，梦想也从肚皮抛到脑后，或者扔给下一代</p>
<p>我很佩服有梦想并且一直坚持的人，无论大小，无论难易，无论正邪，无论成败。我坚信他们是出众的人，是不平凡</p>
<p>常常问自己，我的梦想在哪里？我要成为什么样的人？我要过怎样的生活？梦想这个词，为什么对我那么沉重，而我却又不希望它那么重&hellip;&hellip; </p>
<p>最近对生活对自己很迷茫，廖廖文字，以抒我心 </p>
<p>－pedestrian_i在JE的第100贴（文章: 100）</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/35969#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 25 Nov 2006 23:26:30 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/35969</link>
        <guid>http://pedestrian-i.javaeye.com/blog/35969</guid>
      </item>
      <item>
        <title>[转]SCJP中文大纲</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/32057" style="color:red;">http://pedestrian-i.javaeye.com/blog/32057</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第一部分：声明和访问控制<br /><br />声明，构建，初始化任何类型的数组<br />声明类，内部类，方法，成员变量，静态成员变量和方法变量，并会应用任何合法的修饰符（如public,final,static,abstract,等等）。能够明了这些修饰符单独和组合起来的含义，并且知道被修饰符修饰的任意对象在各种包相关联系下的影响。<br /><br /><br />第二部分：流程控制，断言和异常处理<br /><br />能够正确使用if,switch语句并且在这些语句中能正确使用合法的参数类型。<br />能够正确使用所有带标签或不带标签的循环语句，能使用break,continue，能计算在循环中或循环后循环计数器的值。<br />能够正确使用异常和异常处理语句（try,catch,finally）。能正确声明掷出例外的方法，并知道怎样覆盖它。<br />知道在程序段的特定点出现的异常对程序的影响。即：异常可能是一个runtime exception,一个checked exception也可能是一个error。（这个程序段可能包括try,catch,finally并以任何可能的合法组合出现。）。<br />能正确应用断言，区分正确使用的断言和不正确的。<br />明白关于断言机制的正确说法。<br /><br /><br />第三部分：垃圾收集<br /><br />明白垃圾收集机制确定性的行为。<br />能用程序显式的使一个对象能被垃圾收集器合法的收集。<br />知道在程序的哪一点垃圾收集器能合法地收集一个对象。<br /><br /><br />第四部分：语言基础<br /><br />能正确构建包声明，import声明，类声明（包括内部类），接口声明，方法声明（包括用于开始一个类的执行的main方法），变量声明及其其<br /><br />它的一些说明符。<br />能够正确使用一些类，这些类要么实现了java.lang.Runnable这个接口，要么能正确实现在问题中构建的一些接口。<br />知道传入main函数的命令行参数的index value。<br />知道所有JAVA的keyword。注意：考试中不会出现要你区分keyword和各种常数这类深奥的问题。<br />明白如果没有显式地赋值的各种变量或者数组被使用会出现什么结果。<br />知道所有原始数据类型的取值范围，怎样声明一个String的字面值等等。<br /><br /><br />第五部分：操作与赋值<br /><br />能知道当任何操作符（包括赋值操作符和intanceof操作符）应用于任何操作数（任何类型的类或访问能力或两者的任意组合）的结果。<br />知道String，Boolean和Object类使用equals(Object)方法后的结果。<br />知道当对已经知道值的变量进行&,|,&&,||操作时，哪些操作数被运算了，表达式最终的结果是怎样的。<br />知道Object和原始类型数据传入方法的不同方式，知道如何在这些方法中如何进行赋值或其它修改操作。<br /><br /><br />第六部分：覆盖，重载，运行时期类型及其面向对象<br /><br />知道面向对象设计中封装的好处并能用程序实现紧密封装的类，能知道is a和has a的意义。<br />能正确使用覆盖和重载的方法，能正确调用父类或覆盖了的构建器，知道调用这些方法后的结果。<br />能实例化任何具体的一般顶层类和内部类。<br /><br /><br />第七部分：线程<br /><br />能用java.lang,Thread和java.lang.Runnable两种方法定义，实例化和开始一个新的线程。<br />知道哪些情况下可能阻止一个线程的执行。<br />能使用synchronized,wait,notify和notifyAll去解决避免同时访问及其线程间相互通讯的问题。<br />当执行synchronized,wait,notify和notifyAll时，知道线程和对象锁之间的交互作用。<br /><br /><br />第八部分：在java.lang包中的基础类<br /><br />能够应用Math类中的abs,ceil,floor,max,min,random,round,sin,cos,tan,sqrt方法。<br />正确描述String类不可改变的意义。<br />当执行一段程序，中间包含有wrapper类的一个实例，知道它运行的前提条件运行结果。能用下面wrapper类（例如Integer,Double,等等）的方法来写程序：<br />doubleValue <br />floatValue <br />intValue <br />longValue <br />parseXxx <br />getXxx <br />toString <br />toHexString <br /><br /><br />第九部分：集合类框架<br /><br />知道如何在特定的条件下选择适合的集合类/接口。<br />区分正确和不正确对hashcode方法的实现。
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/32057#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 22:25:58 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/32057</link>
        <guid>http://pedestrian-i.javaeye.com/blog/32057</guid>
      </item>
      <item>
        <title>[建议贴]论坛是否在海版和首页增加新闻频道？</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/31017" style="color:red;">http://pedestrian-i.javaeye.com/blog/31017</a>&nbsp;
          发表时间: 2006年10月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          论坛出现新闻的方式往往都是某某大牛提出关于新技术的新特性，然后引发大家的讨论，或者是其他人零散的发贴告知。<br /><br />能不能用'javaeye管理员'ID来发一些java有关新闻，我想平时大家都有习惯上一些国外网站了解一些新的动态，英文也好，翻译更好。发上论坛，在海版开辟一个新闻频道，在首页提取最新发布或者是热点关注帖子等等。<br /><br />以前上matrix，首页上的java新闻觉得很有用，了解一下技术的更新动态、工具新版本的发布、java world的一些大事件。<br /><br />大家觉得如何？讨论一下。
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/31017#comments" style="color:red;">已有 <strong>8</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Oct 2006 15:01:54 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/31017</link>
        <guid>http://pedestrian-i.javaeye.com/blog/31017</guid>
      </item>
      <item>
        <title>基于Ant+Velocity的简单代码生成器的思路与实现</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/30893" style="color:red;">http://pedestrian-i.javaeye.com/blog/30893</a>&nbsp;
          发表时间: 2006年10月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在SSH项目中，我们应用了service layer模式，所以针对一个模块，它就存在pojo、dao、daoImpl、service、serviceImpl，再到struts中的action、form。假设设计是面向数据库的，针对一个数据库表，那么就要产生7个java文件，如果还要做异常处理，那么就是8个java文件。如果数据库有50个表，那么就是50*8＝400个java文件。工程不小。<br /><br />至于为什么要用service layer模式，论坛上已有讨论http://www.javaeye.com/topic/29867<br /><br />然而我们都知道，web中出现最多的操作是CURD，这400个java文件中有多少代码是重复的？几乎占了80%甚至更多。编写这样重复的代码是很枯燥无味的，而且如果是由不同人负责不同的模块的分工方式，程序员编码的风格是各不相同（虽然可能有规范约束，但是最后出来的东西还是避免不了的带有程序员个人风格的）。<br /><br />所以为了节省时间和精力，便做一个程序来生成程序。<br />只要配置好你的项目名，你的模块名，模块路径，就可以在几秒之内完成一个模块的CURD代码，同时你可以自定义模板。<br /><br />这是工具的大概设计思路：<br /><img src="http://pedestrian-i.javaeye.com/upload/picture/pic/195/830440fc-f0c3-41f2-9282-25f3c490465e.jpg" /><br /><br />由ant处理编译、生成目录的工作，velocity处理程序模板，contentEngine为核心处理程序。<br /><br />产生的目录结构和代码路径：<br />模块名<br />--子模块1<br />----model<br />------businessobject<br />------dao<br />--------hibernate<br />----service<br />------impl<br />----view<br />------action<br />------form<br />----Exception<br />--子模块2<br />...<br />其中model/businessobject中是pojo和hbm.xml，这个由hibernate工具根据数据库表产生。<br /><br />我们假设模块名为course，子模块名为table，类名为CourseMember。因篇幅问题，我们只看一个daoImpl的例子。<br /><br />首先我们利用建立一个daoImpl的模板<br />ObjectDaoHibernateImpl.vm<br /><pre name="code" class="java">
${package_Hibernate}
${import_SQLException}
${import_List}
${import_HibernateCallback}
${import_HibernateObjectRetrievalFailureException}
${import_HibernateDaoSupport}
${import_HibernateException}
${import_Query}
${import_Session}
${import_ObjectNameDao}
${import_ObjectName}
${import_Finder}
${import_Page}
${import_Criteria}
${import_Projections}

/**
 * The Hibernate implementation of the &lt;code>${ObjectName}Dao&lt;/code>.
 * 
 * @author ${Author}
 * @see ${ObjectName}Dao
 */
public class ${ObjectName}DaoHibernateImpl extends HibernateDaoSupport implements ${ObjectName}Dao {
	/**
	 * Default constructor.
	 */
	public ${ObjectName}DaoHibernateImpl() {
		super();
	}
	
	/**
	 * @see ${ObjectName}Dao#save${ObjectName}(${ObjectName})
	 */
	public ${ObjectName} save${ObjectName}(${ObjectName} ${objectname}) {
		this.getHibernateTemplate().save(${objectname});
		return ${objectname};
	}
	
	/**
	 * @see ${ObjectName}Dao#get${ObjectName}(String)
	 */
	public ${ObjectName} get${ObjectName}(String id) {
		return (${ObjectName})this.getHibernateTemplate().load(${ObjectName}.class, id);
	}
	
	/**
	 * @see ${ObjectName}Dao#update${ObjectName}(${ObjectName})
	 */
	public void update${ObjectName}(${ObjectName} ${objectname}) {
		this.getHibernateTemplate().update(${objectname});
	}
	
	/**
	 * @see ${ObjectName}Dao#delete${ObjectName}(${ObjectName})
	 */
	public void delete${ObjectName}(${ObjectName} ${objectname}) {
		this.getHibernateTemplate().delete(${objectname});
	}
	
	/**
	 * @see ${ObjectName}Dao#getAll${ObjectName}s()
	 */
	public List getAll${ObjectName}s() {
		return getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session session)
				throws HibernateException, SQLException {

				StringBuffer sb = new StringBuffer(100);
				//sb.append("select distinct ${objectname} ");
				sb.append("SELECT  ${objectname} ");
				sb.append("FROM  ${ObjectName} ${objectname} ");
				sb.append("order by ${objectname}.id");

				Query query = session.createQuery(sb.toString());
				List list = query.list() ;

				return list;
			}
		});		
	}
	
	
	
	public Object query(final ${ObjectName} ${objectname},
			final int pageNo, final int maxResult) {
		return getHibernateTemplate().execute(new HibernateCallback() {
			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				Criteria criteria=session.createCriteria(${ObjectName}.class);
				Criteria anothercriteria=session.createCriteria(${ObjectName}.class);
				criteria.setProjection(Projections.rowCount());	
			
	//			if (!${objectname}.get${objectname}Name().equals("")
	//					&& ${objectname}.get${objectname}Name() != null) {
	//				criteria.add(Expression.ilike("contactName","%"+customerContactForm.getContactName()+"%"));
	//				anothercriteria.add(Expression.ilike("contactName","%"+customerContactForm.getContactName()+"%"));
	//			}
				Integer count=(Integer)criteria.uniqueResult();
				List list=anothercriteria.setFirstResult((pageNo-1)*maxResult).setMaxResults(maxResult).list();
				Page page=new Page(count.intValue(), maxResult, pageNo);
				return new Finder(list, page);
			}
		});
	}
	
	public boolean deleteBybatch(final String[] chxSong) {
	StringBuffer cusIdList = new StringBuffer(200);
	cusIdList.append("delete from ${ObjectName} where ${objectName}No=");
		for (int i = 0; i &lt; chxSong.length; i++) {
			if (i == 0)
				cusIdList.append(chxSong[i]);
			else
				cusIdList.append(" or ${objectName}No=" + chxSong[i]);
		}
		this.getSession().createQuery(cusIdList.toString()).executeUpdate();
		return true;
	}
	
}
</pre><br />声明：<br />1）其中${}是模板语言中的变量，变量的来源一是通过对应的.properties文件，另外是通过参数传递。<br />2）注释部分因是分页查询条件，这个涉及到具体字段，无法预知，所以需要在产生代码之后程序员根据查询条件自行修改。另外也涉及到个人项目的分页方法，这个根据具体情况自定义模板。<br /><br />template.properties<br />公共属性文件，是所有template文件（.vm）的变量声明处，这个会在后面代码中进行设置。<br />对于属性文件，可有两种方式：<br />一是针对每一个template模板文件都建立一个属性文件，优点是在后面ant中设置的参数就少了，而且方便修改。缺点是模板文件数量增多，另外公共部分声明重复。<br />二是设定一个公共属性文件，将特定的变量交给参数传递。<br />我们这里先用公共属性文件的方式。<br /><pre name="code" class="java">Author = Cmas R&D Team
import_Arraylist = import java.util.ArrayList;
import_List = import java.util.List;
import_Set = import java.util.Set;
import_FacesException = import javax.faces.FacesException;
import_BeanUtils = import org.apache.commons.beanutils.BeanUtils;
import_Log = import org.apache.commons.logging.Log;
import_LogFactory = import org.apache.commons.logging.LogFactory;
import_SQLException = import java.sql.SQLException;
import_HibernateCallback = import org.springframework.orm.hibernate3.HibernateCallback;
import_HibernateObjectRetrievalFailureException = import org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException;
import_HibernateDaoSupport = import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import_HibernateException = import org.hibernate.HibernateException;
import_Query = import org.hibernate.Query;
import_Session = import org.hibernate.Session;
import_Map = import java.util.Map;
import_HashMap = import java.util.HashMap;
import_Iterator = import java.util.Iterator;
import_Criteria=import org.hibernate.Criteria;
import_Projections=import org.hibernate.criterion.Projections;
import_DispatchActionSupport=import org.springframework.web.struts.DispatchActionSupport;
import_Action=import org.apache.struts.action.*;
import_HttpServletRequest=import javax.servlet.http.HttpServletRequest;
import_HttpServletResponse=import javax.servlet.http.HttpServletResponse;
import_BeanUtils=import org.apache.commons.beanutils.BeanUtils;
import_DataIntegrity=import org.springframework.dao.DataIntegrityViolationException;
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/30893#comments" style="color:red;">已有 <strong>15</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Oct 2006 09:38:24 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/30893</link>
        <guid>http://pedestrian-i.javaeye.com/blog/30893</guid>
      </item>
      <item>
        <title>scjp学习笔记之线程</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/30884" style="color:red;">http://pedestrian-i.javaeye.com/blog/30884</a>&nbsp;
          发表时间: 2006年10月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          重中之重，线程部分。多线程的程序写的少，一般都是单线程的。在线程方面训练不够，复习的仔细点。<br />1、线程的三个部分<br />	处理机<br />	代码<br />	数据<br /><br />2、代码可以或不可以由多个线程共享，这和数据是独立的。两个线程如果执行同一个类的实例代码，则它们可以共享相同的代码。<br />类似地，数据可以或不可以由多个线程共享，这和代码是独立的。两个线程如果共享对一个公共对象的存取，则它们可以共享相同的数据。<br />在Java编程中，虚拟处理机封装在Thread类的一个实例里。构造线程时，定义其上下文的代码和数据是由传递给它的构造函数的对象指定的。<br /><br />3、创建线程<br />	多线程编程<br />	从同一个Runnbale实例派生的多线程<br />	线程共享数据和代码。<br /><br />4、一个Thread类构造函数带有一个参数，它是Runnable的一个实例。一个Runnable是由一个实现了Runnable接口(即，提供了一个public void run()方法)的类产生的。<br />例如：<br /><pre name="code" class="java">
   1.public class ThreadTest { 
   2.public static void main(String args[]) { 
   3.Xyz r = new Xyz(); 
   4.Thread t = new Thread(r); 
   5.t.start();} 
   6.} 
   7.
   8.class Xyz implements Runnable { 
   9.int i; 
  10.
  11.public void run() { 
  12.while (true) { 
  13.System.out.println("Hello " + i++); 
  14.if (i == 50) break; 
  15.} 
  16.} 
  17.} 
</pre><br />首先，main()方法构造了Xyz类的一个实例r。实例r有它自己的数据，在这里就是整数i。因为实例r是传给Thread的类构造函数的，所以r的整数i就是线程运行时刻所操作的数据。线程总是从它所装载的Runnable实例(在本例中，这个实例就是r。)的run()方法开始运行。<br />一个多线程编程环境允许创建基于同一个Runnable实例的多个线程。这可以通过以下方法来做到：<br />Thread t1= new Thread(r);<br />Thread t2= new Thread(r);<br />此时，这两个线程共享数据和代码。<br /><br /><br />5、启动线程<br />	使用start()方法<br />	使线程置于可运行状态<br />一个新创建的线程并不自动开始运行。你必须调用它的start()方法。调用start()方法使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。<br /><br />6、尽管线程变为可运行的，但它并不立即开始运行。在一个只带有一个<br /> 处理机的机器上，在一个时刻只能进行一个动作。下节描述了如果有一个以上可运行线程时，如何分配处理机。<br />在Java中，线程是抢占式的，但并不一定是分时的 (一个常见的错误是认为“抢占式”只不过是“分时”的一种新奇的称呼而已) 。<br />抢占式调度模型是指可能有多个线程是可运行的，但只有一个线程在实际运行。这个线程会一直运行，直至它不再是可运行的，或者另一个具有更高优先级的线程成为可运行的。对于后面一种情形，低优先级线程被高优先级线程抢占了运行的机会。<br />一个线程可能因为各种原因而不再是可运行的。线程的代码可能执行了一个Thread.sleep()调用，要求这个线程暂停一段固定的时间。这个线程可能在等待访问某个资源，而且在这个资源可访问之前，这个线程无法继续运行。<br />所有可运行线程根据优先级保存在池中。当一个被阻塞的线程变成可运行时，它会被放回相应的可运行池。优先级最高的非空池中的线程会得到处理机时间(被运行)。<br />因为Java线程不一定是分时的，所有你必须确保你的代码中的线程会不时地给另外一个线程运行的机会。这可以通过在各种时间间隔中发出sleep()调用来做到。<br /><pre name="code" class="java">
   1.public class Xyz implements Runnable { 
   2.public void run() { 
   3.while (true) { 
   4.// do lots of interesting stuff 
   5.: 
   6.// Give other threads a chance 
   7.try { 
   8.Thread.sleep(10); 
   9.} catch (InterruptedException e) { 
  10.// This thread's sleep was interrupted 
  11.// by another thread 
  12.} 
  13.} 
  14.} 
  15.}
</pre><br />注意try和catch块的使用。Thread.sleep()和其它使线程暂停一段时间的方法是可中断的。线程可以调用另外一个线程的interrupt()方法，这将向暂停的线程发出一个InterruptedException。<br />注意Thread类的sleep()方法对当前线程操作，因此被称作Thread.sleep(x)，它是一个静态方法。sleep()的参数指定以毫秒为单位的线程最小休眠时间。除非线程因为中断而提早恢复执行，否则它不会在这段时间之前恢复执行。<br />Thread类的另一个方法yield()，可以用来使具有相同优先级的线程获得执行的机会。如果具有相同优先级的其它线程是可运行的，yield()将把调用线程放到可运行池中并使另一个线程运行。如果没有相同优先级的可运行进程，yield()什么都不做。<br />注意sleep()调用会给较低优先级线程一个运行的机会。yield()方法只会给相同优先级线程一个执行的机会。<br /><br />7、线程的基本控制<br />终止一个线程<br /><br />8、在一段特定的代码中，可以使用静态Thread方法currentThread()来获取对当前线程的引用。Thread.currentThread();<br /><br />9、测试一个线程<br />   isAlive()<br />有时线程可处于一个未知的状态。isAlive()方法用来确定一个线程是否仍是活的。活着的线程并不意味着线程正在运行；对于一个已开始运行但还没有完成任务的线程，这个方法返回true。<br /><br />10、延迟线程<br />存在可以使线程暂停执行的机制。也可以恢复运行，就好象什么也每发生过一样,线程看上去就象在很慢地执行一条指令。<br />   sleep()<br />sleep()方法是使线程停止一段时间的方法。在sleep时间间隔期满后，线程不一定立即恢复执行。这是因为在那个时刻，其它线程可能正在运行而且没有被调度为放弃执行，除非<br />(a)“醒来”的线程具有更高的优先级<br />(b)正在运行的线程因为其它原因而阻塞<br />   join()<br />join()方法使当前线程停下来等待，直至另一个调用join方法的线程终止。例如：<br /><pre name="code" class="java">
public void doTask() {
TimerThread tt = new TimerThread (100);
tt.start ();
...
// Do stuff in parallel with the other thread for 
// a while
...
// Wait here for the timer thread to finish
try {
tt.join ();
} catch (InterruptedException e) {
// tt came back early
}
...
// Now continue in this thread
...
}
</pre><br />可以带有一个以毫秒为单位的时间值来调用join方法，例如：<br />        void join (long timeout);<br />其中join()方法会挂起当前线程。挂起的时间或者为timeout毫秒，或者挂起当前线程直至它所调用的线程终止。<br /><br />12、创建线程的其它方法<br />到目前为止，你已经知道如何用实现了Runnable的分离类来创建线程上下文。事实上，这不是唯一的方法。Thread类自身实现了Runnable接口，所以可以通过扩展Thread类而不是实现Runnable来创建线程。<br /><pre name="code" class="java">
   1.public class MyThread extends Thread {
   2.public void run() { 
   3.while (running) { 
   4.// do lots of interesting stuff 
   5.try { 
   6.sleep(100); 
   7.} catch (InterruptedException e) { 
   8.// sleep interrupted 
   9.} 
  10.} 
  11.} 
  12.
  13.public static void main(String args[]) { 
  14.Thread t = new MyThread(); 
  15.t.start(); 
  16.} 
  17.}
</pre><br />使用那种方法？<br />1）实现Runnable<br />  更符合面向对象的设计：<br />从面向对象的角度来看，Thread类是一个虚拟处理机严格的封装，因此只有当处理机模型修改或扩展时，才应该继承类。正因为这个原因和区别一个正在运行的线程的处理机、代码和数据部分的意义，本教程采用了这种方法。<br />  单继承：	<br />由于Java技术只允许单一继承，所以如果你已经继承了Thread，你就不能再继承其它任何类，例如Applet。在某些情况下，这会使你只能采用实现Runnable的方法。<br />  一致性：	<br />因为有时你必须实现Runnable，所以你可能喜欢保持一致，并总是使用这种方法。<br />2）扩展Thread：<br />当一个run()方法体现在继承Thread类的类中，用this指向实际控制运行的Thread实例。因此，代码不再需要使用如下控制：<br />Thread.currentThread().join();<br />而可以简单地用：<br />join();<br />因为代码简单了一些，许多Java编程语言的程序员使用扩展Thread的机制。注意：如果你采用这种方法，在你的代码生命周期的后期，单继承模型可能会给你带来困难。<br />所以，还是继承runnable方法好。<br /><br />关键字synchronized<br />它提供Java编程语言一种机制，允许程序员控制共享数据的线程。<br />想象一个表示栈的类。这个类最初可能象下面那样：<br /><pre name="code" class="java">
   1.public class MyStack {
   2.
   3.int idx = 0; 
   4.char [] data = new char[6]; 
   5.
   6.public void push(char c) { 
   7.data[idx] = c; 
   8.idx++; 
   9.} 
  10.
  11.public char pop() { 
  12.idx--; 
  13.return data[idx]; 
  14.} 
  15.}
</pre><br /><br />13、对象锁标志<br />每个对象都有一个标志，它可以被认为是“锁标志”。<br />synchronized允许和锁标志交互。<br />在Java技术中，每个对象都有一个和它相关联的标志。这个标志可以被认为是“锁标志”。 synchronized关键字使能和这个标志的交互，即允许独占地存取对象。看一看下面修改过的代码片断：<br />public void push(char c) {<br />synchronized(this) { <br />data[idx] = c;<br />idx++;<br />}<br />}<br />当线程运行到synchronized语句，它检查作为参数传递的对象，并在继续执行之前试图从对象获得锁标志。<br />意识到它自身并没有保护数据是很重要的。因为如果同一个对象的pop()方法没有受到synchronized的影响，且pop()是由另一个线程调用的，那么仍然存在破坏data的一致性的危险。如果要使锁有效，所有存取共享数据的方法必须在同一把锁上同步。<br />如果pop()受到synchronized的影响，且另一个线程在原线程持有那个对象的锁时试图执行pop()方法时所发生的事情：<br />当线程试图执行synchronized(this)语句时，它试图从this对象获取锁标志。由于得不到标志，所以线程不能继续运行。然后，线程加入到与那个对象锁相关联的等待线程池中。当标志返回给对象时，某个等待这个标志的线程将得到这把锁并继续运行。<br /><br />14、释放锁标志<br />线程执行到synchronized()代码块末尾时释放<br />synchronized()代码块抛出中断或异常时自动释放<br />此外，如果一个线程对同一个对象两次发出synchronized调用，则在跳出最外层的块时，标志会正确地释放，而最内层的将被忽略。
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/30884#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Oct 2006 08:25:26 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/30884</link>
        <guid>http://pedestrian-i.javaeye.com/blog/30884</guid>
      </item>
      <item>
        <title>scjp学习笔记之异常</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/30346" style="color:red;">http://pedestrian-i.javaeye.com/blog/30346</a>&nbsp;
          发表时间: 2006年10月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          加紧进度，异常部分。<br />1、什么是异常？<br />在Java编程语言中，异常类定义程序中可能遇到的轻微的错误条件。可以写代码来处理异常并继续程序执行，而不是让程序中断。<br />异常类定义程序所遇到的轻微错误<br />发生下列情况时，会出现异常：<br />    想打开的文件不存在<br />    网络连接中断<br />    受控操作数超出预定范围<br />    非常感兴趣地正在装载的类文件丢失<br />    错误类定义严重的错误条件<br /><br />2、调用栈机制<br />如果方法中的一个语句抛出一个没有在相应的try/catch块中处理的异常，那么这个异常就被抛出到调用方法中。如果异常也没有在调用方法中被处理，它就被抛出到该方法的调用程序。这个过程要一直延续到异常被处理。如果异常到这时还没被处理，它便回到main()，而且，即使main()不处理它，那么，该异常就异常地中断程序。<br /><br />3、finally<br />如果终止程序的System.exit()方法在保护码内被执行，那么，这是finally语句不被执行的唯一情况。这就暗示，控制流程能偏离正常执行顺序，比如，如果一个return语句被嵌入try块内的代码中，那么，finally块中的代码应在return前执行。<br /><br />4、Throwable类不能使用，而使用子类异常中的一个来描述任何特殊异常。每个异常的目的描述如下：<br />-	Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。<br />-	RuntimeException表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。比如，如果数组索引扩展不超出数组界限，那么，ArrayIndexOutOfBoundsException异常从不会抛出。比如，这也适用于取消引用一个空值对象变量。因为一个正确设计和实现的程序从不出现这种异常，通常对它不做处理。这会导致一个运行时信息，应确保能采取措施更正问题，而不是将它藏到谁也不注意的地方。<br />-	其它异常表示一种运行时的困难，它通常由环境效果引起，可以进行处理。例子包括文件未找到或无效URL异常（用户打了一个错误的URL），如果用户误打了什么东西，两者都容易出现。这两者都可能因为用户错误而出现，这就鼓励程序员去处理它们。<br /><br />5、Java编程语言提供几种预定义的异常。下面是可能遇到的更具共同性的异常中的几种：<br />-	ArithmeticException—整数被0除，运算得出的结果。<br />-	int I =12 / 0；<br />-	NullPointerException—当对象没被实例化时，访问对象的属性或方法的尝试：<br />-	Date d= null;<br />-	System.out.println(d.toString());<br />-	NegativeArraySizeException—创建带负维数大小的数组的尝试。<br />-	ArrayIndexoutofBoundsException—访问超过数组大小范围的一个元素的尝试。<br />-	SecurityException—典型地被抛出到浏览器中，SecurityManager类将抛出applets的一个异常，该异常企图做下述工作（除非明显地得到允许）：<br />-	访问一个本地文件<br />-	打开主机的一个socket，这个主机与服务于applet的主机不是同一个。<br />-	在运行时环境中执行另一个程序<br /><br />6、处理或声明规则<br />-	用try-catch-finally块来处理异常<br />-	使用throws子句声明代码能引起一个异常<br /><br />7、程序员可以做满足该要求的两件事：<br />    第一，通过将Try｛｝catch（）｛｝块纳入其代码中，在这里捕获给被命名为属于某个超类的异常，并调用方法处理它。即使catch块是空的，这也算是处理情况。<br />    第二，让被调用的方法表示它将不处理异常，而且该异常将被抛回到它所遇到的调用方法中。它是按如下所示通过用throws子句标记的该调用方法的声明来实现的：<br />    public void troublesome() throws IOException<br />   关键字throws之后是所有异常的列表，方法可以抛回到它的调用程序中。尽管这里只显示了一个异常，如果有成倍的可能的异常可以通过该方法被抛出，那么，可以使用逗号分开的列表。
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/30346#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Oct 2006 21:33:36 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/30346</link>
        <guid>http://pedestrian-i.javaeye.com/blog/30346</guid>
      </item>
      <item>
        <title>scjp学习笔记之高级语言特性</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/29745" style="color:red;">http://pedestrian-i.javaeye.com/blog/29745</a>&nbsp;
          发表时间: 2006年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近忙一些琐事，一度将scjp抛到脑后，着实不该。速战速决。<br />今天复习一下java的一些高级语言特性……<br />1、static变量、方法是针对类而言，而不是对象。注意要在外部调用必须是public，而不是private，小心这个陷阱。<br /><br />2、非静态变量只限于实例，并只能通过实例引用被访问。也就是说static方法中不能调用非static变量。<br /><br />3、静态初始化程序<br />在static block中，类可以包含方法程序中不存在的代码。当类被装载时，静态代码块只执行一次。<br />static{}<br /><br />4、static综合例子一个<br /> <br /><pre name="code" class="java">1．	class MyClass {
2．	  static int statInt = 4;
3．	  static Double statDouble = 16.0;
4．	  int instInt;
5．	  double instDouble;
6．	
7．	  public static void statMethod(){
8．	    System.out.println ("statInt="+statInt+ 
9．	        ";statdouble="+statDouble);
10．	} 
11．	public void instMethod(){ 
12．	  System.out.println("instInt="+instInt+ 
13．	    ";instdouble="+instDouble); 
14．	} 
15．	public MyClass(int intArg, double doubleArg){
16．	  instInt = intArg;
17．	  instDouble = doubleArg;
18．	} 
19．	public static void main(String args[]){
20．	  MyClass instance1 = new MyClass(1,2.0);
21．	  MyClass instance2 = new MyClass(3,4.0);
22．	  
23．	  MyClass.statMethod(); //Outputs:statInt=4;
24．	         //statDouble=16.0
25．	
26．	  instance1.instMethod(); //Outputs:instInt=1; 
27．	        //instDouble=2.0 
28．	  instance1.statMethod(); //Outputs:statInt=4;
29．	        //statDouble=16.0 
30．	  
31．	  instance2.instMethod(); //Outputs:instInt=3;
32．	        //instDouble=4.0 
33．	  instance2.statMethod(); //Outputs:statInt=4;
34．	        //statDouble=16.0 
35．	}
36．	} 
</pre><br /><br />5、关键字final<br />Final类不能被分成子类<br />Final方法不能被覆盖<br />Final变量是常数<br /><br />6、被声明为final的方法有时被用于优化。编译器能产生直接对方法调用的代码，而不是通常的涉及运行时查找的虚拟方法调用。<br />被标记为static或private的方法被自动地final，因为动态联编在上述两种情况下都不能应用。<br /><br />7、如果变量被标记为final，其结果是使它成为常数。想改变final变量的值会导致一个编译错误。<br />如果将引用类型（即，任何类的类型）的变量标记为final，那么该变量不能指向任何其它对象。但可能改变对象的内容，因为只有引用本身是final。<br /><br />8、抽象类<br />声明方法的存在而不去实现它的类被叫做抽象类<br />可以通过关键字abstract进行标记将类声明为抽象<br /><pre name="code" class="java">     public abstract class Drawing {
           public abstract void drawDot(int x, int y);
           public void drawLine(int x1, int y1,
                               int x2, int y2) {
             // draw using the drawDot() method repeatedly.
           }
         }</pre><br />一个abstract类可以包含非抽象方法和变量<br />声明方法的存在而不是实现，以及带有对已知行为的方法的实现，这样的类通常被称做抽象类。通过用关键字abstract进行标记声明一个抽象类。被声明但没有实现的方法（即，这些没有程序体或{}），也必须标记为抽象。<br /><br />9、不能创建abstract类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。<br />Abstract类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类。<br /><br />10、接口<br />接口是抽象类的变体。<br />在接口中，所有方法都是抽象的。<br />多继承性可通过实现这样的接口而获得。<br />句法是：<br /><pre name="code" class="java">
           public interface Transparency {
             public static final int OPAQUE=1;
             public static final int BITMASK=2;
             public static final int TRANSLUCENT=3;

             public int getTransparency();
           }
</pre><br />接口是抽象类的变体。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。<br /><br />11、对于下述情况，接口是有用的：<br />声明方法，期望一个或更多的类来实现该方法。<br />揭示一个对象的编程接口，而不揭示类的实际程序体。（当将类的一个包输送到其它开发程序中时它是非常有用的。）<br />捕获无关类之间的相似性，而不强迫类关系。<br />描述“似函数”对象，它可以作为参数被传递到在其它对象上调用的方法中。它们是“函数指针”（用在C和C++中）用法的一个安全的替代用法。<br /><br />12、高级访问控制<br />没有其他，记住这个表就OK了。<br />  修饰符      同类       同包      子类      通用性 <br />  公共        是         是        是          是<br />  受保护      是         是        是<br />  缺省        是         是<br />  私有        是                                   <br /><br />13、降    级<br />降级就是过时的构造函数和方法调用。<br />过时的方法和构造函数由具有更标准化的命名规则的方法所取代。<br />当升迁代码时，用-deprecation标志来编译代码：<br />    javac -deprecation MyFile.java<br /><br />14、==运算符与equals()方法<br />这个应该是说的最多的一个<br />equals()和==方法决定引用值是否指向同一对象<br />equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。<br /><br />15、toString()方法<br />被用来将一个对象转换成String<br />被用来将一个基本类型转换成String<br />对象类定义缺省的toString()方法，它返回类名称和它的引用的地址（通常情况下不是很有用）。许多类覆盖toString()以提供更有用的信息。例如，所有的包装类覆盖toString()以提供它们所代表的值的字符串格式。甚至没有字符串格式的类为了调试目的常常实现toString()来返回对象状态信息。<br /><br />16、内部类<br />允许一个类定义被放到另一个类定义里<br />把类在逻辑上组织在一起<br />可访问它们所嵌套的类的范围<br /><br />17、为什么需要内部类？<br />java中的内部类和接口加在一起，可以的解决常被C++程序员抱怨java中存在的一个问题——没有多继承。实际上，C++的多继承设计起来很复杂，而java通过内部类加上接口，可以很好的实现多继承的效果。<br />一个内部类的对象能够访问创建它的对象的实现――包括私有数据；<br />对于同一个包中的其他类来说，内部类能够隐藏起来；<br />匿名内部类可以很方便地定义回调；<br />使用内部类可以非常方便地编写事件驱动的程序。<br /><br />18、内部类属性<br />类名称只能用在定义过的范围中，除非用限定的名称。<br />内部类的名称必须与所嵌套的类不同。<br />内部类可以被定义在方法中。<br />任何变量，不论是本地变量还是正式参数，如果变量被标记为final，那么，就可以被内部类中的方法访问。<br />内部类可以被定义为abstract。<br />只有内部类可以被声明为private或protected，以便防护它们不受来自外部类的访问。访问保护不阻止内部类使用其它类的任何成员，只要一个类嵌套另一个。<br />一个内部类可以作为一个接口，由另一个内部类实现。<br />被自动地声明为static的内部类成为顶层类。这些内部类失去了在本地范围和其它内部类中使用数据或变量的能力。<br />内部类不能声明任何static成员；只有顶层类可以声明static成员。因此，一个需求static成员的内部类必须使用来自顶层类的成员。<br />内部类有常常被用作创建事件适配器的方便特征。<br /><br />19、包装类<br />用来将基本数据元素看作对象，包装类可以被用作：                          <br />        基本数据类型     包装类 <br />          boolean      Boolean<br />         byte         Byte<br />         char         Char<br />         short        Short<br />         int          Int<br />         long         Long<br />         float        Float<br />         double       Double<br />Java编程语言不把基本数据类型看作对象。例如，在基本格式本身当中，数字、布尔及字符型数据都被看作是为了提高效率。Java编程语言提供包装类来将基本数据元素看作对象。这样的数据元素被包裹在创建于它们周围的对象中，每个Java基本数据类型在Java.lang包中都有一个相应的wrapper class。每个包装类对象封装一个基本值。<br />可以通过将被包裹的值传递到合适的构造函数中来构造包装类对象。例如：<br />int pInt = 500;<br />Integer wInt = new Integer(pInt);<br /><br />20、收集API<br />收集（或容器）是代表一个对象组的单个对象，被认为是它的元素。<br />收集类Vector,Bits,Stack,Hashtable,LinkedList等等都被支持。<br />收集API包括将对象保持为下述情况的界面：<br />      收集-没有具体顺序的一组对象<br />      设定-没有复制的一组对象<br />      列表-有序对象组，允许复制<br /><br />21、反射API<br />可以用作<br />      构造新类实例和新数组<br />      访问并修改对象和类的字段<br />      调用对象和类中的方法<br />      访问并修改数组的元素<br />只要安全策略允许，这些操作是可能的。在需要运行时检索并处理信息的情况下，反射API是有用的。例如，如果正在编写一个Java软件解释程序或调试程序，可以使用它。<br /><br />22、反射API特征<br />定义类和方法的核心反射API的主要特征如下：<br />      Java.lang.Class类提供方法，该方法可获得有关类及其字段、构造函数以及方法的信息。<br />      Java.lang.reflect.Field提供方法，该方法设定/获得有关类中的字段的信息。<br />      Java.lang.reflect.Method提供方法，该方法访问并调用类中的方法，并获得它们的签名。<br />      Java.lang.reflect.Array能使数组对象自省。<br />      Java.lang.reflect.Constructor提供反射访问到构造函数。<br /><br />23、反射API安全模型<br />Java安全管理器一个类接一个类地控制对核心API的访问。<br />当下述情况发生时，标准的Java编程语言访问控制得到加强：<br />  Field被用来获得或设定一个字段值<br />  Method被用来调用一个方法<br />  Constructor被用来创建并初始化一个新的类的实例
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/29745#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Oct 2006 11:48:51 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/29745</link>
        <guid>http://pedestrian-i.javaeye.com/blog/29745</guid>
      </item>
      <item>
        <title>scjp学习笔记之对象基础</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/26949" style="color:red;">http://pedestrian-i.javaeye.com/blog/26949</a>&nbsp;
          发表时间: 2006年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天复习了java的一些基本概念和容易出错的细节，今天开始复习一下“对象基础”。<br />1、OOP语言有三个特征：封装、多态性及继承。<br /><br />2、在许多程序语言中，一旦一个集合数据类型已经定义，程序员定义应用函数在该类型的变量上运行，该变量在代码和集合类型（除非可能在命名规则中）之间无任何联系。<br />有些程序语言，包括Java，允许在数据类型的声明和操作该类型变量的代码的声明之间有紧密的联系。这种联系通常被称为抽象数据类型。<br />Java编程语言中的抽象数据类型概念被认为是class。<br /><br />3、值传递<br />Java编程语言只由值传递参数，当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。<br /><br />4、重载方法名称<br />它可如下所示使用：<br />public void println(int i)<br />public void println(float f)<br />public void println()<br />参数表必须不同，返回类型可以不同。<br /><br />5、对于this的任何调用，如果出现，在任何构造函数中必须是第一个语句。<br /><br />6、如果增加一个带参数的构造函数声明到一个类中，该类以前没有显式构造函数，那么将失去该缺省构造函数。基于这一点，对new Xxx()的调用将会引起编译错误。认识到这一点很重要。<br /><br />7、每个类都是Object的一个子类，因此，可以用Object数组作为任何对象的容器。唯一不能被增加到Object数组中的唯一的东西就是基本变量（以及包装类，请注意这一点）。比Object数组更好的是向量类，它是设计来贮存异类收集对象的。<br /><br />8、单继承性<br />当一个类从一个唯一的类继承时，被称做单继承性。单继承性使代码更可靠。界面提供多继承性的好处，而且没有（多继承的）缺点。java语言是单继承的。<br /><br />9、构造函数不能被继承<br />子类从超类（父类）继承所有方法和变量，子类不从超类继承构造函数<br />包含构造函数的两个办法是<br />    使用缺省构造函数<br />    写一个或多个显式构造函数<br /><br />10、多态性<br />有能力拥有有许多不同的格式，就叫做多态性。<br />一个对象只有一个格式。<br />一个变量有许多格式，它能指向不同格式的对象。所以变量是多态性的。<br /><br />11、Object类定义许多有用的方法，包括toString(),它就是为什么Java软件中每样东西都能转换成字符串表示法的原因。（即使这仅具有有限的用途）。<br /><br />12、多态性是个运行时问题，与重载相反，重载是一个编译时问题。<br /><br />13、关键字super<br />super被用在类中引用其超类。<br />super被用来调用超类的成员变量。<br />超类行为就被调用，就好象对象是超类的组件。<br />调用行为不必发生在超类中，它能自动向上层类追溯。<br /><br />14、Instanceof 运算符<br />假如能使用引用将对象传递到它们的父类中，那么有时你想知道实际有什么，这就是instanceof运算符的目的。使用instanceof来测试一个对象的类型。<br /><br />15、对象的类型转换<br />使用instanceof来测试一个对象的类型。<br />用类型转换来恢复一个对象的全部功能。<br />用下述提示来检查类型转换的正确性：<br />  向上的类型转换是隐含地实现的。<br />  向下的类型转换必须针对子类并由编译器检查。<br />当运行时错误发生时，运行时检查引用类型。<br /><br />16、覆盖方法<br />子类可以修改从父类继承来的行为<br />子类能创建一个与父类方法有不同功能的方法，但具有相同的<br />  名称<br />  返回类型<br />  参数表<br /><br />17、调用覆盖方法<br />覆盖方法的规则<br />  必须有一个与它所覆盖的方法相同的返回类型<br />  不能比它所覆盖的方法访问性差<br />  不能比它所覆盖的方法抛出更多的异常。<br /><br />18、调用父类构造函数<br />对象的初始化是非常结构化的。<br />  当一个对象被初始化时，下述行为按顺序发生：<br />  存储空间被分配并初始化到0值<br />  层次中的每个类都进行显式初始化<br />  层次中的每个类都调用构造函数<br />因此，Java编程语言总是在执行子构造函数前调用父类构造函数的版本。
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/26949#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Oct 2006 10:49:00 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/26949</link>
        <guid>http://pedestrian-i.javaeye.com/blog/26949</guid>
      </item>
      <item>
        <title>scjp学习笔记之基本概念</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/26518" style="color:red;">http://pedestrian-i.javaeye.com/blog/26518</a>&nbsp;
          发表时间: 2006年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做了一年有余的java开发，只是局限于j2ee那些框架的学习了，根本却忘记了，这是件很可怕的事情，感觉到自己java基础实在是薄弱，对于一些基本概念重要类库的使用以及java本身的IO流控制多线程编程不够深入，所以决定趁sun对大学生实行scjp优惠之时，好好复习java，也为不久后的招聘增加一份筹码。<br />步入正题，今天学习的是java的一些最基本概念。平时若是叫我回答这些问题，肯定是说不好的。因为太那个了=.=<br />1、什么是java?<br />-	一种编程语言<br />-	一种开发环境<br />-	一种应用环境<br />-	一种部署环境<br />-	句法与C++相似，语义与Small Talk相似<br />-	用来开发applets，又用来开发applications<br /><br />2、设计Java编程语言的主要目标是:提供一种易于编程的语言<br />-	消除其它语言在诸如指针运算和存储器管理方面影响健壮性的缺陷。<br />-	利用面向对象的概念使程序真正地成为可视化程序<br />-	为使代码尽可能清晰合理、简明流畅提供了一种方法<br /><br />3、Java虚拟机<br />-	提供硬件平台规范<br />-	解读独立于平台的已编译的字节码<br />-	可当作软件或硬件来实现<br />-	可在Java技术开发工具或Web浏览器上实现<br /><br />4、Java虚拟机规范为Java虚拟机（JVM）作了如下定义：<br />在真实机器中用软件模拟实现的一种想象机器。Java虚拟机代码被存储在 .class文件中；每个文件都包含最多一个public类。<br />编译器在获取Java 应用程序的源代码后，将其生成字节码，它是为JVM生成的一种机器码指令。每个Java解释器，不管它是Java技术开发工具，还是可运行applets的Web浏览器，都可执行JVM。<br />JVM的代码格式由紧缩有效的字节码构成。由JVM字节码编写的程序必须保持适当的类型约束。大部分类型检查是在编译时完成。<br />任何从属的Java技术解释器必须能够运行任何含有类文件的程序，这些类文件应符合Java虚拟机规范中所指定的类文件格式。<br /><br />5、JVM为下列各项做出了定义<br />-	指令集（中央处理器［CPU］ ）<br />-	注册集<br />-	类文件格式<br />-	栈<br />-	垃圾收集堆<br />-	存储区<br /><br />6、垃圾收集<br />-	不再需要的分配存储器应取消分配<br />-	在其它语言中，取消分配是程序员的责任<br />-	Java编程语言提供了一种系统级线程以跟踪存储区分配<br />-	垃圾收集<br />-	可检查和释放不再需要的存储器<br />-	可自动完成上述工作<br />-	可在JVM实现周期中，产生意想不到的变化<br /><br />7、Java运行环境(就是jre)<br />执行三大任务<br />-	加载代码－由类加载器执行<br />-	校验代码－由字节码校验器执行<br />-	执行代码－由运行时的解释器执行<br /><br />8、Java技术源程序采用有效的16-bit 双字节字符编码标准(Unicode) ，而不是8-bit ASCII文本。因而，一个字母有着更广泛的定义，而不仅仅是a到z和A到Z。所以char类型是可以用来表示汉字的，而在C/C++中是不够表示汉字的。<br /><br />9、java的八个类型<br />-	逻辑类   boolean<br />-	文本类   char<br />-	整数类   byte, short, int, long<br />-	浮点类   double, float<br /><br />10、Java编程语言的一些编码约定是：<br />    classes──类名应该是名词，大小写可混用，但首字母应大写。例如：<br />                class  AccountBook<br />                class  ComplexVariable<br />    interface──界面名大小写规则与类名相同。<br />                interface  Account<br />    method──方法名应该是动词，大小写可混用，但首字母应小写。在每个方法名内，大写字母将词分隔并限制使用下划线。例如：<br />                balanceAccount（）<br />                addComplex （）<br />据说scjp会考这样的细节，汗。平时eclipse用惯了- -b<br /><br />11、局部变量必须使用之前初始化, 否则编译时将出错<br />使用对象前必须先判断其是否为空，防止nullpoint。<br /><br />12、label: 语句；// where statement must be any<br />               // legal statement.<br />这个少用，感觉有点像C里面的goto，和break、continue结合起来用。<br /><br />13、数组是一个对象，而不是为原始类型储备的存储器<br />在Java编程语言中，即使数组是由原始类型构成，甚或带有其它类类型，数组也是一个对象。声明不能创建对象本身，而创建的是一个引用，该引用可被用来引用数组。数组元素使用的实际存储器可由new语句或数组初始化软件动态分配。<br /><br />14、Java编程语言没有象其它语言那样提供多维数组。因为一个数组可被声明为具有任何基础类型，所以你可以创建数组的数组(和数组的数组的数组，等等)。一个二维数组如下例所示：<br />int twoDim [][] = new int [4][];<br />twoDim[0] = new int[5];<br />twoDim[1] = new int[5];
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/26518#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Oct 2006 10:49:00 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/26518</link>
        <guid>http://pedestrian-i.javaeye.com/blog/26518</guid>
      </item>
      <item>
        <title>Someday we will know-Patrick Nuo</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/29563" style="color:red;">http://pedestrian-i.javaeye.com/blog/29563</a>&nbsp;
          发表时间: 2006年10月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Someday we will know, we will know, we will know   <br />Someday we will know, we will know   <br /><br />How could you know all the answers to my questions   <br />If I couldn't show you what I feel   <br />Day after day you've been waiting for confession   <br />But I was just hiding away in my dreams   <br />I can't make you stay in a frameless portrait   <br /><br />But someday you'll remember what you never knew   <br />Someday you'll find out that blind love is through   <br />When I pray that we'll find a way to look back on today together   <br />Someday we will know   <br /><br />Someday we will know, we will know, we will know   <br />Someday we will know, we will know, we will know   <br /><br />How will I know that you'll be ok tomorrow   <br />When you're so far away from me   <br />Night after night I enjoy this endless sorrow   <br />Cause maybe it's not the end of our story   <br />I can't make you stay in a frameless portrait   <br /><br />It's someday you'll remember what you never knew   <br />Someday you'll find out that blind love is through   <br />When I pray that we'll find a way to look back on today together   <br />Someday we will know   <br /><br />Someday we will know, we will know, we will know   <br />Someday we will know, we will know, we will know   <br /><br />Our love went straight but I want to start to pray   <br />We'll find a way someday   <br />And I know it didn't happen all in vain   <br />Someday your heart will tell you what you have to do   <br />Your heart will find out what you never knew   <br />Cause your heart can never forget   <br />So let's try to, let's try to, find out a way   <br />To look back on today together   <br />Someday we will know   <br /><br />Someday we will know, we will know, we will know (Maybe we'll know)   <br />Someday we will know, we will know, we will know (Someday)   <br />Someday we will know, we will know, we will know (We will know that love is true)   <br />Someday we will know, we will know, we will know (Someday)   <br />Someday we will know, we will know <br /><br />总有一天,我们会知道，我们会知道，我们会知道…… <br />如果我不能告诉你我的真实感受，你怎么会知道我所有问题的答案 <br />一天一天地过去，你一直在等待着我的坦白。 <br />可是我却悄悄把它隐藏在了我的梦中。 <br />我不能把你一直停留在没有结构的肖像中。 <br /><br />也许有一天你会记得你曾经所不知道的事情， <br />有一天你会发现那黑暗的爱情已经破裂。 <br />当我祈祷着我们将会找到一个合适的方式去回忆今天我们在一起的时光。 <br />总有一天，我们会知道，我们会知道，我们会知道…… <br /><br />当你离我很遥远的时候，我将怎样知道你明天将会好起来。 <br />一个夜晚一个夜晚地过去，我静静地享受着这结束的痛苦。 <br />因为也许，那并不是我们的故事的结局。 <br />我不能把你一直停留在没有结构的肖像中。 <br /><br />也许有一天你会记得你曾经所不知道的事情， <br />有一天你会发现那黑暗的爱情已经破裂。 <br />当我祈祷着我们将会找到一个合适的方式去回忆今天我们在一起的时光。 <br />总有一天，我们会知道，我们会知道，我们会知道…… <br /><br />我们的爱变得越来越直爽明白，可是我却想开始祈祷 <br />祈祷着我们有一天将会找到一个合适的方式。 <br />并且我知道它不会徒然地发生。 <br />有一天，你的心将会告诉我你必须做什么， <br />你的心将会找到你曾经所从未知道的事情。 <br />因为你的心从未遗忘过。 <br />所以，让我们尝试吧，让我们尝试吧，让我们尝试吧， <br />尝试找到一个好的方式去回忆今天我们在一起的时光。 <br /><br />总一天我们会知道，我们会知道，我们会知道（也许我们会知道）…… <br />总一天我们会知道，我们会知道，我们会知道（也许我们将会知道我们的爱是真的）<br />我们将会知道，我们将会知道，我们将会知道………………
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/29563#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Oct 2006 22:25:10 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/29563</link>
        <guid>http://pedestrian-i.javaeye.com/blog/29563</guid>
      </item>
      <item>
        <title>被远光录用实习</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/28881" style="color:red;">http://pedestrian-i.javaeye.com/blog/28881</a>&nbsp;
          发表时间: 2006年10月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          远光面试结果出来了，预料之中的被录用了。只是略感不爽的是，去了19个录了12个，感觉面试把关不够严格。也有可能是宽进严出吧，听说有每月考核淘汰制度。当然，我对我留下是完全有信心的。<br /><br />还未定实习时间，小道消息说是1月份。这也太夸张了点，1月到至今还有两个多月。11月课程结束之后到1月这段时间我干嘛去啊？那个时候同学们应该都走光了，会无聊的。还是先在哪里实习一下先吧，实习到1月再回去远光，这个想法不错。<br /><br />刚好金山也来招聘，把简历给了班主任，然后再由学校集中送简历过金山，金山先筛选简历之后，通知学生去公司笔试、面试。大公司就是不一样，说大牌也好说正规也好，对我来说都无所谓。后来班主任打电话给我说叫我好好准备，我的简历是所有简历当中比较好的，她已经帮我写了推荐信，并且将简历放在最上面了。我很感谢她，一直以来她对我都还不错。<br /><br />我想去金山又不想去，很矛盾。想去的原因是金山毕竟是大企业，有企业文化，我去过珠海的研发部参观过，硬性环境虽然一般，但是气氛却很好，能够感受到团队感受到声音，这是我期望的工作生活，而不是死气沉沉的编码，朝九晚五的工作生活。不想去的原因是金山的主打方向是C/C++，而不是java，我喜欢java不太喜欢C/C++，一直都觉得C/C++太严谨没有java那么好玩，而且用java也有段日子了不想丢弃它。Java部门在金山是一个很小的部门，只做电子政务，无发展前途。其实现在金山的主打方向是游戏，美国竟会给7000W美金风险投资做剑侠情缘3，全3D游戏。国内盗版太厉害了，金山那些通用软件无法生存了。其实金山应该转向行业软件，要不然真会把通用软件部门抹杀了。<br /><br />面试还没去，现在说这些也为时过早了。实习是为工作做准备，可能会留在远光吧。毕竟是搞我喜欢的Java。<br /><br />最近无聊，没有事做。就再看看spring，理解透彻一些，另复习一下J2SE把scjp给过了。生活有些单调。原本不想去的党支部聚餐最后还是打算去了，况且还有小暖MM，可以聊聊。<br />之前一直都没什么感觉，却突然那天晚上看到她清澈的眼睛，情况发生了改变。不知怎的，眼睛会说话的女孩子一直都能扑获我。这是个怪圈。<br /><br />敢尝试就会有收获，脸皮厚才会有气候。
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/28881#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Oct 2006 21:29:02 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/28881</link>
        <guid>http://pedestrian-i.javaeye.com/blog/28881</guid>
      </item>
      <item>
        <title>建议贴，博客是否允许游客评论？</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/28674" style="color:red;">http://pedestrian-i.javaeye.com/blog/28674</a>&nbsp;
          发表时间: 2006年10月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          javaeye现在的blog功能还不支持游客评论，这样导致技术的讨论只能限制在javaeye会员中，如果对blog的观点有心得有看法，那还必须先注册个ID，注册完了还有几天发贴限制，那么麻烦的流程相信没几个人会愿意做下去，仅仅为发表自己的观点。<br />要评论就要求是会员，这样的限制是不是严格了点？一般的blog都提供游客评论，这样技术交流才简单方便，如果游客们觉得javaeye好，有氛围，观点被认可或者是被反驳，自然就会加入到javaeye的圈子。<br />当然，javaeye的blog和论坛是相连的。如果blog增加了游客评论，就意味着论坛相应的帖子中也需要增加游客的评论内容，这个和javaeye的一些规定有所冲突，比如新会员限制发贴等项。<br />想了几个解决方法：<br />1）游客评论只添加到blog，而不出现在论坛上。这个法子并不好，有些游客评论很有价值，那么论坛上无法引用。<br />2）如果blog文章添加到论坛中，则不允许游客评论。如果没有添加，则允许游客评论。<br />3）blog和论坛都允许游客评论。这个可能比较麻烦，管理员是否能权衡一下实现？<br />因为朋友想在我的blog评论却发现要会员，导致不便，大家是否也有这样的困扰，浅薄意见拿出来大家讨论下。
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/28674#comments" style="color:red;">已有 <strong>12</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Oct 2006 14:14:42 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/28674</link>
        <guid>http://pedestrian-i.javaeye.com/blog/28674</guid>
      </item>
      <item>
        <title>学校开公司？难不难？</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/28581" style="color:red;">http://pedestrian-i.javaeye.com/blog/28581</a>&nbsp;
          发表时间: 2006年10月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上午被通知2点10分去远光笔试加面试，中午就赶紧把证件证书什么的复印了三份，以备不时之需。又被通知，2点钟准时到车库集合，看来去的人不少啊，还需要良师傅专车接送。后来发现，20个- -b<br /><br />原本是没有去远光的机会的，远光来招聘的那天我已经在深圳参加高交会了。后来是在远光工作的师兄kevin推荐的，才把简历给投上去算是报个名，简历还是在深圳某小网吧花了一个小时现写的。因为之前没打算要去远光，总想着倪总安排的事，如果成了就去吧，一点主见都没有=.=。后来和阿泉和小明仔细的分析了一下，实在是没有前途，就想还是自己找工作踏实点吧。<br /><br />倪总要开公司，要我们做技术支持，这是好事，我们也愿意做开国元勋。以学校为物质品牌后盾，以学生为公司人才来源，挖掘聪明能干的学生作为公司的新员工，这样一届一届的发展下去就能够扩大公司规模。我们作为技术骨干，能够有机会挑大梁干大事，跟着倪总干一番事业，这固然是很好的设想。可是这可行吗？实际吗？<br /><br />首先，学生作为员工，这是一个并不好的策略。学生刚刚从学校毕业或者没有毕业，经验尚浅，要他们立即投入开发还需要时间，要培养锻炼他们也是很需要精力的。那么谁来培训他们？糊涂还是我们，要糊涂来培训，显然是给他的工作压力太大了，人一多就很不现实了，他也没那么多精力去培训新员工；如果是我们，那就更加不行了，我们自身的水平就很有限，只是刚刚进入软件开发这个行业，经验尚且不到一年，又有何资格去培训新人？就算是培训了也是难以胜任的，而且误导别人是很可怕的。再说，人培养好了，如果不想留怎么办？频繁的人员流动是上次put项目最大的问题最大的失败！<br /><br />其次，我们作为第一批员工，作为技术骨干，能否胜任？put做了一年多，才出来那么个有点模样的软件，我们开发者都认为是很不成熟的一个产品。要把它推入市场还有很多路要走？说实话，我没有那个信心，put开始设计的时候就已经很有问题，在后面扩展上一定会出现一些不可预知的大问题。从05年7月到现在，从不懂啥是java到现在能够开发一定规模的项目，学到的东西是不少，糊涂教给我们的东西也是很多，但是凭这点点经验和能力，能够挑起一个公司的技术部门骨干的重任吗？不行，我完全没有信心。我们都没有信心。如果还是继续做出像put这样或者只是略有提高的软件，那么这些产品会有人要吗？<br /><br />所以，没有足够数量有经验的人作为技术骨干，公司是撑不起来的。单单凭糊涂一人之力，太微薄，他也太累。<br /><br />另外，一个很现实的问题，资金。公司的资金从哪里来？虽然说有学校作为后盾，设备场地这些硬性设施可以借助于学校，但是人工怎么办，没有固定的资金和固定的收入，怎么维持公司的运转？难道还像409一样？有项目接就有经费，没项目接就大家无聊？打一枪换个地方的游击做法只适合一个练兵的实验室，而不是一个正规的公司。再说项目的经费实在是少了可怜，少到不可能给员工正常的工资。每个月300的补助，那么大的劳动强度，怎么能受得了。我们是学生，参与项目锻炼自己是好事，钱我们无所谓多少。但是很快我们就不再是学生，那个时候钱对我们就意味着很多了。<br /><br />如果说要成就一个可以产生效益的产品，那么这个产品从哪里来？照这样的班子开发下去，很难有所成就。如果说以学校的名义去承接项目，那么技术后盾从哪里来？如果要有技术后盾，那么资金又从哪里来？这是一个严谨的循环。<br /><br />再一个，公司管理方面存在问题。倪总在管理人员上做的是不错，但是她不会介入到公司的日常运作中，因为她还有很多事情要做。那么糊涂就顺其自然的成为了管理者，而糊涂的管理方式却略显松散，不知道是不是因为我们是学生的原因。任务玩玩不能按时完成，进度一拖再拖。预期目标无法实现，完成时间无法预见。虽然在人性化上糊涂做的不错，但是在压力方面还是强度不够，我不知道如果我们是正式员工，是否会要求严格一点，但是现在的强度是的确不够的，有些人实在是太松散了，有些人的任务实在是太少了。另外，不可能所有的事情都是糊涂管理，那么还有些事谁来做，哪个老师有那么闲？来帮忙？这样连管理层都无法确定，人心怎能安定？<br /><br />put项目我就看出来了，真正做事的待遇低，那些经常不见人面的待遇却是好了。原因是什么？因为是老师，我们是学生，这个我还不在意。但是以后呢？这样的风气会不会继续盛行？老师们很忙，我知道，他们要上课，没办法。既然如此，那么如果不能为项目组做出贡献就不应该拿着那份薪水。我比较单纯，我认为公司应该按老分配，而不能把学校政府那套带出来，谁权大就钱大，不做事也可以挂个名，这样的风气怎么能让做事者服气？如果没有大批能够全职的员工工作，只是靠老师们零零散散的时间，怎么能按时完成进度？<br /><br />最后，谈谈我们自己的前途问题。继续留在这里，技术方面能接触到的只有糊涂，那么他的技术理念和思想我感受的已经差不多了。再不换个环境我觉得自身很难有一个大幅度的提高，只有在周边都是高手都有研究氛围的环境下，才能给自身一个很大的提高。否则局限在409，一直都是小范围的活动，对思想见识都很局限。再者，从社会经历上来说，我们一直都呆在学校，社会上的事经历甚少，阅历浅做事缺乏方式，面对突发事件无法做出适合场合的反应。这些阅历是无法在学校这样的环境下锻炼出来的，同时你认识的人就少了，你的社会圈子就很小，圈子小就难以发展，无发展就难有作为。就如一句话：你的朋友如果全是老总，你也会成为老总。到不是说老总们多有学问，而是老总们能给你机会而平常人没有。不出去锻炼锻炼，永远都无法认识社会，无法跟上社会的步伐，无法被这个社会认同。<br /><br />没有固定资产，员工没有固定收入，公司整日担心无事可做，管理上的松懈，自身前途的担忧，很容易慌的。虽然说情况也许没那么糟糕，但是凡事都需要考虑周全。我在409看不到它的希望，虽然我很希望它好，但是它缺乏条件。<br /><br />所以我去了远光面试，结果还未知，不过感受到了想被人认可的欲望，急切想知道自己是否被录取。虽然只是个实习面试，远光还是做的挺正规的，先笔试再面试，笔试的题目是一些简单的基础题还有些逻辑推理题。面试是两位技术人员，问的也是简历上写的范围内的东西，我感觉自己的面试时间有点快，大概就5分钟左右吧，却问了MVC、struts、spring、hibernate、ajax这些技术的好处、原理；sql server2000的应用程度，对存储过程的理解以及自主开发的代码生成器的原理。感觉答的还不错，那么短的时间确让我有点心虚。怎么说都是我的第一次面试，迫切想知道自己结果，自己是否被远光认可。<br /><br />虽然不是一定去远光，小暖说我应该去深圳试试，挑战一下更高难度的公司，我也想，再准备准备吧。要对自己自信，要敢对人说我行！
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/28581#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Oct 2006 23:09:50 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/28581</link>
        <guid>http://pedestrian-i.javaeye.com/blog/28581</guid>
      </item>
      <item>
        <title>第八届高交会</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/27380" style="color:red;">http://pedestrian-i.javaeye.com/blog/27380</a>&nbsp;
          发表时间: 2006年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第一次参加高交会，不知道以前办的如何。这一届至今为止就我的感觉来说还是不错的，参展的单位比较多元化，几个展区参观的人数都比较多。12号刚开始的时候，觉得能参加这样的大型活动对我来说还是很有意义的。所以热情就显得比较高，而且当时也是内部展，观众大多数都是参展商或者是政府机关相关的一些人，都是有机会交易的。有不少相当数量的观众来到摊位咨询，我非常有耐心的解说，而且主动出击。＝＝<br /><br />  12号来了不少领导，最大的就数吴仪副总理了。本来打算是11号的开幕式，推迟到12号下午，可见国家领导是非常忙的，估计她参加完这边的开幕式，又风风火火的冲去广交会的开幕式了。说到她，还有个小插曲，原本巡视的路线是经过广东区的，结果在距广东区30米的时候，被人群一挡，转去另外的方向了，结果就没来广东区，而这边广东省的领导们和南方卫视都等待已久。结果说不来了，被然拉去**区了，领导们很生气，记者们很失望，广东人民翘首以望，结果还是没能瞻仰到总理威仪。其实我也颇为失望，想想还没见过啥国家领导呢，好不容易有机会，结果被人撞了＝＝虽然我不认识谁是吴总理！只知道是个女士...<br /><br />  我们的摊位安排在9号馆广东区，9号馆的参展商都是来自各省各市、还有一些外国产商，其中最大的摊位是广东，过来就是香港，其他省市也不小，个个弄的都有很特色。当然最有特色的还是广东，太多而太杂了，每个摊位都是很小，不如其他省市的集中。有点印象的就是四川有个机器人乐队，有个机器人在吹笛子，还蛮可爱的；西藏也来参加了，不过没怎么去看，估计是看了忘记了，当时就想，那么远，来一趟可真不容易啊=.=<br /><br />robsoft的机器人踢足球，还是有点意思，后来去1号馆看到lenovo也有机器人踢足球，比较一下，还是觉得robsoft的要好一些，毕竟人家也是专业D。<br /><br />  到今天，正式对外开放。人较昨天多了不少，但是观看性质的观众就多了。一些观众瞧了瞧就走了；一些就拿点资料，尽管我觉得他们是不是会看；一些观众就拖着一个大大的袋子，真的是拖，见着什么名片资料就往里面扔，我们把他们称为“专业观众”，他们回去旅馆再次淘金，不过估计大半数是要被丢弃的；只有一部分观众会弄弄，询问一些问题，和你聊上两句，这种一般也是愿意留下名片的。<br /><br />  下午有人替班，正好去把昨天没逛完的几个馆给逛了。俺是个IT小工，很多参展作品，俺硬是看不懂，激光啊机械啊机器人、药品、生物、能源什么的，就是走走过场，咱不懂就不去凑那个热闹了，除非那有PLMM^^<br /><br />  1号馆是最大的馆，都是些比较有实力的参商还有深圳本地的商家，深圳还分了好几个区，主办方就是不一样，不过都是些小摊位，公司名大部分都是**科技公司，搞高科技的，IT软硬件、数码产品。粗略看了看也没啥吸引人的，就撤了。<br /><br />  1号馆内有个我认为最有创意和市场的产品，是一个将图片中的文字转换为word等文本文件的产品。公司名忘记了，名字倒挺长，该技术也获得世界啥啥金奖，我也忘记了。摊位被围了好几圈，我一看到展示，搜索了下脑袋，好像据我所知还没有见过这类技术，如果有的话那可能是俺无知了。这下可好了，盗版电子书要更猖狂了＝＝<br /><br />  其他大型产商，如apple、lenovo、benq、甲骨文、创纬、康佳等等都搞的有声有色，场子大，观众多。特别是康佳，模特策略使得人山人海，我硬是没挤上前一堵各位MM风采，只能远远观望又恨怎么没带眼镜。还好lenovo、benq、创纬补充了我，MM们真的是漂亮到没话说，财大气粗就是不一样。在深圳的同志们，去看了可真别忘了去看这几个摊位^^，下次有机会再发照片上来吧。让我失望的是甲骨文，那么大一场子就没几个人，也没啥东西，浪费了那么大一空间，真是……<br /><br />  3号馆没啥好看，其实是我没怎么看懂。2号馆是机械方面的，就记得nec的MM不错--，sony的摊位设计不错，而且MM也很养眼，只可惜到了那里相机竟然没电，泪啊……MM们还是很配合拍照的，一见到相机都会做几个pose。<br /><br />  4号馆是有关能源，完全不明白，就pass了。<br /><br />  6号馆有些模型，火车、汽车，据说有核装置，很有兴趣的去找，结果未遂==<br /><br />  7号馆有个有意思的地方，个人创新展区，都是些发明爱好者，位置不大，不过个个旁边都有好些人，发明者激情的演讲，听众也饶有兴趣，看了几个产品，还不错，创意还好，有个怪怪的饮水机设计的。发现，发明者会有些怪怪的，但是要比其他公司产商要有激情的多，毕竟这是展示他们自己的舞台。还有大学区，有个同事对我说，香港科技大学的那个东西三年前开发的，到现在还拿来参展啊，也没见有什么改进啊。本人不发表言论，因为我看不懂那东东。<br /><br />  5、8都没开展。<br /><br />  逛了一圈回来，顿时就没劲头了，想想还有好几天呢？坐在摊位前就感觉，这地其实就有点像是大商场，我就充当一次销售员吧，不过说实话，这销售员真的很累，整天大部分时间站着，人来了马上要接待，解说，递送资料给名片要名片，可见销售员真的不是那么好当的，我还是愿意躲在房子里写代码==<br /><br />  据旁边摊位的GG说，高交会比不得广交会，这里没交易，只是卖概念，而广交会则是现场交易，每年的交易额都达上百亿。他来了高交会几次了，对此了解甚多，所以他索性不理摊位了，叫我帮忙看着别少了东西，自己乐去了==。<br /><br />  敲了那么多，累了，留点精神给明天看位吧- -!，下次有好玩的事继续，顺便把照片发上几张。^^
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/27380#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Oct 2006 21:30:09 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/27380</link>
        <guid>http://pedestrian-i.javaeye.com/blog/27380</guid>
      </item>
      <item>
        <title>自动编码的探讨与实现</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/25574" style="color:red;">http://pedestrian-i.javaeye.com/blog/25574</a>&nbsp;
          发表时间: 2006年10月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          自动化编码（Code Generation）的探讨与实现<br /><br />摘要<br /><br />       现今阶段软件开发越来越成熟，开发人员关注的焦点从以前的编程到如今的系统设计。软件的代码越来越向一致化的方向发展，编写大量的类似代码却频频在开发中出现。这就要我们去解决这个问题：如何降低程序员的工作量，更加突出系统设计，让程序员更加轻松，让软件更加高效稳定。本文提出了利用自动化编码的方式来解决这个问题，在本文中我们将会探讨几个问题：什么是代码生成？为什么要代码生成？代码生成适合在哪些场合？如何去设计和实现自己的代码生成器？代码生成器在项目和产品中的应用现状是怎样的一个状况？使用代码生成会给项目带来什么样的风险？我们将一一讨论这几个问题来了解代码生成器，并且探讨它给软件开发带来怎样的优势。<br /><br />关键词：自动化编码、代码生成器<br /><br />名词解释<br /><br />[1] MDA：模型驱动的体系MDA（Model Driven Architecture）是由全球最大的软件工业标准化组织OMG（Object Manage Group）提出，MDA是经过OMG推出CORBA、OOP、UML等标准之后，大力推广的一套体系标准。<br /><br />引言<br /><br />人类发明了计算机来让它做那些枯燥无味的事情，而将自己解脱出来，去做有创造性的事情。使用 Code Generation将使开发人员从单调无味的代码中解脱出来，去做更有创造性的设计。<br /><br />在现在的软件开发中，程序员们需要手写代码。为什么不能够让机器写代码呢？那么，以后程序员就不是程序员了，而是设计师，他们设计能够自动写程序的程序。如果这个思路得到普及，软件行业的生产力也会得到飞速的提升，软件开发也会进入一个工业时代。<br /><br />这个思路就是CodeGeneration。这个技术其实并不是什么新思路，我们平时使用的IDE环境中都大量使用了CodeGeneration。只是这项技术仍然不够普及，大家平时在编写程序的时候，缺少一种代码自动化的意识。<br /> <br /><br />一、什么是代码生成？<br /><br />       代码生成是使用程序生成代码的一种技术。这些程序包括从很小的帮助性质的脚本，到创建大量完整应用程序中的业务逻辑模型。对于代码生成应用软件，并没有一种固定的模式，可以使用命令行或者GUI，它们可以创建一种或多种程序语言的代码，可以多次创建代码。没有固定的输入和输出。代码生成的共同的特点就是生成器的输出是代码，这些代码是可以通过手工编写来完成的。<br /><br />二、为什么需要代码生成？<br /><br />软件工程中有两个永恒不变的定理：<br />1、  程序员的时间是很宝贵的。<br />2、  编程并不是重复无聊的工作。<br />代码生成解决了软件开发中编写重复代码的无聊工作，采用了自动化的形式将重复代码按照程序员定制的规格由特定的程序产生。这样程序员将有更多的时间去关注软件在设计上的问题和扩展，有时间和精力去挑战更高难度、他们自身感兴趣的工作。将程序员从烦闷的复制粘贴中解脱出来，这才能更好的发挥他们自身的聪明才智。<br /><br />代码生成不仅仅是避免了一些繁琐无聊的编程工作，它更多的是给软件开发以下面六个方面的优势：<br /><br />1、  开发效率<br /><br />当代码生成器第一次运行的时候，对于代码生成技术的这一好处是很容易认识到的。你从输入一些对输出代码的设计中所需的输入开始，几乎就在同时，你得到了你的设计所实现的代码。无论怎样，真正的高效率就在你运行生成器来创建基于设计的代码时就开始了。你有几次看见一个项目的需求没有变化过？这就是基于变化的需求生成代码的能力<br /><br />2、  产品质量<br /><br />通过代码生成器生成的代码的质量是由用来生成目标代码的代码和模版的质量决定的，当这些代码和模版的质量提高时，重新生成的代码的质量基于此也会提升。<br /><br />3、  代码一致性<br /><br />由代码生成器生成的代码有很强的一致性，变量命名，方法命名，类命名都通过相同的方式创建。这些使得生成的代码便于使用和分层。<br /><br />4、  抽象<br /><br />一些生成器基于目标代码的抽象模型来创建代码。比如：你可以创建一个sql Schema 和数据访问层代码，从xml中定义数据库中的表，字段，关系和查询。这种抽象的价值在于生成器可以重新定位以创建其他平台上的代码。这意味着你的业务逻辑和规则拥有了可移植性。而你不必为不同的平台编写代码。<br /><br />5、  开发成本<br /><br />当然在第一次开发生成器的时候，它所付出的代价会比较高，需要有不少的人力物力去设计、实现、测试。这也属于软件本身的一部分风险投资，如果生成器开发完成，并且初步投入使用没有发生重大问题，那么它对项目组以后的开发就有不可估量的作用。在加快开发进度的同时，也就意味着开发成本的降低。项目组可以在短时间内高质量的完成项目开发甚至测试，这样无形中就将人力物力财力都降下来了。所以成功开发出代码生成器，意味着一劳多得，可以一直延续用下去，当然你还需要对它不断的维护和优化，精益求精。<br /><br />6、  软件风险<br /><br />软件项目的风险无非体现在以下四个方面：需求、技术、成本和进度。那么代码生成器在这四个方面体现出什么样的价值呢？因为代码生成器的生命周期是在项目的开发阶段，所以它对于需求分析带来的风险无能为力。但是对于技术风险，生成器是可以把握的。<br /><br />我们从整体上分析了代码生成器对软件开发带来的效益，也简单的讨论了对于程序员、软件工程师，代码生成器意味解放：抛弃繁重的重复代码编写工作，突出设计决定。<br /><br />然而前线是前线，更往上层是管理人员和公司，怎么让你的老板接受你的代码生成器呢？对于管理人员、公司，代码生成器存在的理由是什么呢？<br /><br />代码生成可以给项目管理以很多好处，比如提高了生成效率和产品质量，这是不容置疑的。但是，真正的优势却在于业务层和管理层，让我们看看代码生成给业务层和管理层带来了什么：<br /><br />1、  结构一致性<br />项目采用了代码生成使得项目的整体结构在软件生命周期的前期就已经确定，这个举措有三点优势：<br />1）  鼓励程序员在确定的结构中工作编程<br />2）  当代码生成不能完成我想要的工作的时候，这是一个设计偏离现有结构的暗示<br />3）  一个有详细文档可维护性好的代码生成工具提供了一致的结构和方法，即使团队成员离开，新成员也能很快地着手工作<br /><br />2、  抽象性<br />代阿生成工具已经将应用逻辑呈现出来，包括业务逻辑、数据库定义文件、页面定义等等。从应用中抽象出这些语义并且实现有以下几个好处：<br />1）  可以随时通过新建模板将逻辑应用到其他程序语言或者其他平台上，这比手工编码要容易的多。<br />2）  业务分析员可以检查和验证抽象的设计以确保业务无误。<br />3）  在抽象层上提取应用的语义可以将设计和实现分离，降低系统的耦合度。<br /><br />3、  高昂的士气<br />如果项目期限很长，会让团队难以忍受，如果项目中有大量无聊乏味的重复代码编写工作，那么情况将更糟。代码生成器减少了程序员的工作，加快了项目时间进度表，让程序员可以有更多的时间去关注他们感兴趣的工作。同时由于代码生成器产生的代码有高质量、一致性等特点，项目成员对项目将会更加有信心并且引以为豪。<br /><br />4、  快速开发<br />代码生成器最重要的特点之一就是易扩展性，可以对需求的改变快速的作出反应，在很短的时间修改程序以适应新的需求。<br /><br />       所以，我们看到代码生成有那么多好处，还要坚持要手工写代码吗？还要去忍受那些无聊繁重、重复的代码吗？还需要拷贝－粘贴－替换吗？<br /><br />       当然是不需要！<br /><br />三、代码生成适合在哪里场合<br /><br />既然我们前面阐述了那么多好处，为什么我们不到处都使用代码生成？但是事实上，任何事物，只有在适合的场合才能发挥出它的最大功效，代码生成也是如此，如果场景错误，那么可能会造成无法估计的损失，那么代码生成在哪里适用呢？笔者认为当程序员遇到如下的情况的时候，可以考虑使用代码生成：<br /><br />1、开发一个成熟的代码生成器也是需要付出很多代价的，所以代码生成器必须是在项目开发中有大量的类似的代码。而这种情况最常出现在数据库访问和用户界面上。<br /><br />最多的是用在数据库访问方面，因为数据访问的代码是重复性非常高的。另外，生成数据访问层为提供了技术平台的可移植性和平台可移植的益处提供了标准。<br /><br />用户界面编码也有很大的重复性，所以它也成为生成器的通常的目标。另外，一个用户界面生成器也可以提供多方面的实现，比如针对同一份定义，生成胖客户端和瘦客户端。<br /><br />2、你必须考虑设计和表现层的稳定性。当表现层不是非常稳定的时候，或者是设计需要发生变化的时候，在全盘使用代码生成之前你首先要考虑手工编写原型代码。<br /><br />3、单一的代码生成器不是万能的，必须要和其他的工具结合起来才能合适地解决特殊的问题，代码生成器使用得当将会非常强大，同时在错误的环境中使用将使项目变得繁重艰难。<br /><br />四、如何去设计适合的代码生成器<br /><br />每个人遇到的问题都是不一样的，我们可以把代码生成器看作是一个产品，而项目组成员是用户，那么每个用户的需求是不一样的，每个程序员要求代码生成器所要做的事也是各式各样的。那么我们在这里来讲设计就是不可完成的任务，也是不可靠的。但是有一些原则它们是可以抽象出来成为代码生成器的共性，以下讨论10个设计原则：<br /><br />       1、对手工编码要持尊重和憎恶的态度<br />尽管代码生成可以免去许多重复的工作，提高开发效率，但是你必须知道无论你的生成器有多么强大，多么灵活，都有很多特殊情况存在，这些可能都在你的代码生成器可归纳的范围之外。所以，虽然你使用了代码生成器，但是手写代码仍然是必需的。<br /><br />       2、先亲手写代码<br />即使有必要使用代码生成，也要在你确定你了解你的框架的时候再开始使用它。<br /><br />       3、控制源代码<br />一个好的源代码管理系统是代码生成项目成功的必须的。如果你的生成器操作了已经包含了手写代码的文件，你就更需要一个版本管理系统来保障你的工作<br /><br />       4、仔细考虑慎重选择实现语言<br />用来实现生成器的工具不同于实现应用程序的工具。生成器的一个问题就是它尝试去解决那些应用程序所要解决的许多完全不同的问题。基于这一点，你应当认把生成器作为一个独立的项目来真的选择你的工具。<br /><br />       5、将代码生成器的开发加入到项目开发进程中<br /><br />生成器是工程师们使用的工具，所以，它应当合理的，完整的结合到开发过程中。可以使它整合到IDE工具中，或者build过程中。<br /><br />       6、包含警告，对错误操作的提示，需要有良好的容错性<br />生成器生成的代码中应当对那些不应被改动的地方作出警告，以防止被手工改动。如果被手工改动，那么生成的代码的版本就无法保证一致。同时有可能使重要的地方出现不可预期的行为。<br /><br />       7、友好<br />生成器是给程序员使用的工具，但是这并不意味着它就可以很粗糙。生成器应当告诉工程师他能够作什么，正在作什么，它生成了哪些文件。生成器应当是易用的，界面友好的。<br /><br />       8、务必文档化<br />好的文档是生成器的一个卖点。你的文档应当完整，清晰，但是不要过多。而且要对关键的地方作特殊的说明，比如生成器能作什么，如何安装，怎样运行等。<br /><br />       9、要记住并不是所有的人都会接受代码生成<br />给你的同僚们看文档，培训，一个接一个的会议，这些对于你的生成器的成功推广是很危险的。人们对新事物总是充满怀疑，你需要让他们认识到生成器会给他们带来怎样的好处。<br /><br />       10、经常维护<br />除非生成器只是一个临时的方案，否则在很长时间内都要认真的进行维护，生成器控制着大量的代码，维护生成器和维护代码具有同样的意义，你应当安排专门的时间和金钱来维护、升级它。<br /><br />五、代码生成器在项目和产品中的应用现状<br /><br />代码生成所包含的面非常之广，但是对于目前最普遍的层生成器，所使用的技术有很多是共通的。下面简单介绍层生成器所普遍使用的几项技术，以及为你的层生成器选择一门开发语言所要考虑的要点。<br /><br />从目前的软件应用上看，代码生成有以下的几种实现方式：<br /><br />1、模板技术：代码生成通常意味着创建具有复杂结构文本类型的文件。为了维护生成器的简单性和完整性，你可以使用文本模板工具，这样你可以把逻辑的定义和逻辑的代码格式相分离，这是最理想的情况。<br /><br />模板一直以来都是CodeGeneration的主要实现手段。C++使用模板来实现泛型机制。而众多的建模工具和IDE工具都使用模板来重用代码。在Apache组织的旗下，有一个名为Velocity的项目，它的目的就是提供一种易用的模板技术。Velocity使用了一种脚本语言，叫做Velocity Template Language (VTL)。目前，Velocity主要用于生成Web站点的动态内容。此外，还有更出色的FreeMaker，它比Velocity更全面，可以说Velocity是轻量级的模板技术，而Freemaker是一个强大重量的模板引擎，相比velocity而言，其强大的过程调用、递归和闭包回调功能让freemaker可以完成几乎所有我们所想的功能。此外还有很多的模板技术，这里就不一一介绍了。<br /><br />2、面向属性编程<br /><br />英文缩写虽然同样都是AOP，但面向属性编程（Attribute-Oriented Programming ）和面向切面编程（Aspect-Oriented Programming ）可不是一回事。面向属性编程是通过在代码中添加元数据（属性）的方式来自动产生代码，添加功能。而这方面最优秀的软件莫过于xDoclet。<br /><br />XDoclet 是一个通用的代码生成实用程序,是一个扩展的Javadoc Doclet引擎(现已与Javadoc Doclet独立),XDoclet是EJBDoclet的后继者，而EJBDoclet是由Rickard Oberg发起的。它允许您使用象 JavaDoc 标记之类的东西来向诸如类、方法和字段之类的语言特征添加元数据。随后，它利用这些额外的元数据来生成诸如部署描述符和源代码之类的相关文件。可以让你创建自己的javadoc @tags进而利用XDoclet中的Templet enging基于这些@tags生成源代码或其他文件。<br /><br />3、MDA（Model Driven Architecture模型驱动架构）<br /><br />MDA能够将特定的模型转换为特定平台的代码。AndraMDA就是其中的代表者。在具体实现上，AndraMDA主要采用了模板技术，同时，它也利用了xDoclet技术。所以，AndraMDA是在前两项技术的基础上实现CodeGeneration的。<br /><br />4、正则表达式：用来检索，扫描源文件，以提取你要用到的信息，正则表达式的缺点就是不易阅读。<br /><br />5、XML：读入XML文件，进行解析，验证，或者把XML文件作为代码生成器的输出。<br /><br />6、文件目录的操作：几乎是每个生成器都会使用的技术，从文件读入代码格式，将生成的代码写到输出文件中。<br /><br />7、命令行：命令行有自己的优势，由于代码生成有很多自动过程，所以在有些情况下命令行更高效，简捷。<br /><br />相应的CodeGeneration技术还有很多，以上只是列出了比较有代表性，影响比较广的几种，详细的介绍了最常用的三种方式。<br /><br />六、代阿生成在项目应用所存在的风险<br /><br />       我觉得使用代码生成器有风险。使用任何一项新技术，都会带来一定的风险。但我们不能因为有风险就成为不使用的理由，因为如果从不使用新技术的话，就不会有这方面的风险。但另外的更大的风险发生了，企业被客户和社会所淘汰。因此，我们需要对代码生成器所可能带来的风险进行评估。那么它会存在哪些风险呢？<br /><br />    1、程序员不愿意使用代码生成器<br /><br />         我们可以分析一下程序员不愿意使用代码生成器的原因：<br /><br />         1）生成的代码质量太差，看不懂，bug太多。这是选错了代码生成器的原因。<br /><br />         2）生成的代码不支持变化的需求与设计。这是体系架构运用不当的问题。使用代码生成器，使用与代码生成器相适应的的优秀的体系架构和技术,比如比较严格的     界定层与类的功能。<br /><br />3）代码生成器约束了我的编码思想。实际上这是一个误区。代码生成器造就了千辟一律风格的代码，我写的精致代码反倒成了另类。 风格相同是软件维护容易的一个重要特性。<br /><br />       2、爆炸性错误<br /><br />由于是机器产生的代码，所以所有的代码都是一样的，这样容易维护，但是同时也带来一个问题：假如代码生成器存在错误，那么所有由代码生成器生成的代码都会存在同一个错误，这时你就不得不修改代码生成器，通过测试，然后再产生一次所有的代码。这个时候新的问题又出现了，如果说你的生成代码经过修改，比如业务变更或者说你的代码生成器并不管业务层（这就意味着业务层代码都是需要手写的），那么你的这些修改如何保存？是继续由生成器生成？还是手工去修正错误？那么数目怎么确定呢？什么地方需要修改呢？一系列的问题接踵而至。这个时候就需要你根据具体情况选择一种改动最轻最不影响系统的方案。同时我们也就要意识到你开发的代码生成器必须要经过严格的测试才能投入正常使用。<br /><br />代码生成实际上是一个用生成器来替代重复，枯燥的手工编码过程，本身并没有使用任何特别的技术，只是一个简单的替代过程，理论上应该风险是很小的。实际上，现在的代码生成器智能化，可配置性已很高，基本能够生成自己所想要的代码，部分代码生成器商还提供商业化的生成过程，更能满足自己的特定需要。<br /><br />结束语<br /><br />       代码生成器有好处，同时也存在风险，如何正确地使用它，这需要管理人员和设计人员共同决策。本文我们只是讨论了代码生成器的几个基本问题，还未涉及到具体实现。只是希望读者在看完本文之后，对代码生成器有一个大概的了解，在以后的软件开发中存在自动化编码的意识，在适当的地方使用代码生成技术以提高开发的效率和软件的质量。<br /><br />参考文献<br /><br />[1] 代码生成-CodeGeneration<br /><br />http://youwg.blogdriver.com/youwg/326638.html<br /><br />[2] Jack Herrington  Code Generation in antion  Manning Publications (July 1, 200
          <br/><br/>
          <span style="color:red;">
            <a href="http://pedestrian-i.javaeye.com/blog/25574#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Oct 2006 16:10:01 +0800</pubDate>
        <link>http://pedestrian-i.javaeye.com/blog/25574</link>
        <guid>http://pedestrian-i.javaeye.com/blog/25574</guid>
      </item>
      <item>
        <title>[Hibernae+Spring]压力测试所引起的死锁和无法同步？</title>
        <author>pedestrian_I</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pedestrian-i.javaeye.com">pedestrian_I</a>&nbsp;
          链接：<a href="http://pedestrian-i.javaeye.com/blog/25546" style="color:red;">http://pedestrian-i.javaeye.com/blog/25546</a>&nbsp;
          发表时间: 2006年10月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          项目在压力测试中有个业务流程无法通过50个用户同时并发，初步认为是由于一个实体类无法和数据库同步而失败。这个实体类是下面错误信息中的SysBillManage。<br />首先简单的说明一下SysBillManage，它的功能是根据传递参数分配单据号，并且实现自增。比如是出库通知单，那么参数是OUT_DO_INFORM_ORDER，那么得到的结果是OutB0000001这样的形式的单据号，每一次增加出库通知单则单据号增1，既是OutB0000002。其中参数OUT_DO_INFORM_ORDER对应于数据库SysBillManage表中的一条记录的ID。<br />在用silkperformer 6.5做压力测试的时候，则出现一下