如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開(kāi)源團(tuán)隊(duì)

          http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks

          #

          為了鞏固 CGLib 的知識(shí),下面我們實(shí)現(xiàn)一個(gè)稍微復(fù)雜一點(diǎn)的例子。

          例、請(qǐng)實(shí)現(xiàn)一個(gè)攔截器,使其能夠檢測(cè)一個(gè) JavaBean 的哪些字段改變了。

          1 )首先定義一個(gè) JavaBean 。

          public class PersonInfo

          {

          ???? private String name;

          ?

          ???? private String email;

          ?

          ???? private int age;

          ?

          ???? private String address;

          ?

          ???? public String getEmail()

          ???? {

          ???????? return email;

          ???? }

          ?

          ???? public void setEmail(String email)

          ???? {

          ???????? this.email = email;

          ???? }

          ?

          ???? public String getName()

          ???? {

          ???????? return name;

          ???? }

          ?

          ???? public void setName(String name)

          ???? {

          ???????? this.name = name;

          ???? }

          ?

          ???? public String getAddress()

          ???? {

          ???????? return address;

          ???? }

          ?

          ???? public void setAddress(String address)

          ???? {

          ???????? this.address = address;

          ???? }

          ?

          ???? public int getAge()

          ???? {

          ???????? return age;

          ???? }

          ?

          ???? public void setAge(int age)

          ???? {

          ???????? this.age = age;

          ???? }

          }

          2 )定義一個(gè) MethodInterceptor ,這一步是最關(guān)鍵的 。

          import java.lang.reflect.Method;

          import java.util.Collections;

          import java.util.HashSet;

          import java.util.Set;

          ?

          import net.sf.cglib.proxy.MethodInterceptor;

          import net.sf.cglib.proxy.MethodProxy;

          ?

          public class JavaBeanDataChangeInterceptor implements MethodInterceptor

          {

          ???? private static final String SET = "set";

          ?

          ???? private Set changedPropSet;

          ?

          ???? public JavaBeanDataChangeInterceptor()

          ???? {

          ???????? changedPropSet = new HashSet();

          ???? }

          ?

          ???? public Object intercept(Object obj, Method method, Object[] args,

          ????????????? MethodProxy proxy) throws Throwable

          ???? {

          ???????? String name = method.getName();

          ???????? if (name.startsWith(SET))

          ???????? {

          ????????????? String s = name.substring(SET.length());

          ????????????? changedPropSet.add(s);

          ???????? }

          ???????? return proxy.invokeSuper(obj, args);

          ???? }

          ?

          ???? public Set getChangedPropSet()

          ???? {

          ???????? return Collections.unmodifiableSet(changedPropSet);

          ???? }

          ?

          ???? public void reset()

          ???? {

          ???????? changedPropSet.clear();

          ???? }

          }

          定義一個(gè)集合 changedPropSet 用來(lái)存放修改了的字段名,增加了一個(gè)方法 reset 用來(lái)清空此集合,增加了一個(gè) getChangedPropSet 方法用來(lái)供外界得到修改了的字段,為了防止調(diào)用者對(duì) changedPropSet 做修改,因此我們采用 Collections.unmodifiableSet 對(duì)返回的集合進(jìn)行不可修改的修飾。

          intercept 方法中,我們判斷如果被調(diào)用的方法以 set 開(kāi)頭,則把此字段名放入 changedPropSet 集合中。

          3 )定義剖析用工具類。

          import net.sf.cglib.proxy.Callback;

          import net.sf.cglib.proxy.Factory;

          ?

          public class JavaBeanInterceptorUtils

          {

          ???? public static JavaBeanDataChangeInterceptor getInterceptor(

          ????????????? Object obj)

          ???? {

          ???????? if (!(obj instanceof Factory))

          ???????? {

          ????????????? return null;

          ???????? }

          ???????? Factory f = (Factory) obj;

          ???????? Callback[] callBacks = f.getCallbacks();

          ???????? for (int i = 0, n = callBacks.length; i < n; i++)

          ???????? {

          ????????????? Callback callBack = callBacks[i];

          ????????????? if (callBack instanceof JavaBeanDataChangeInterceptor)

          ????????????? {

          ?????????????????? return (JavaBeanDataChangeInterceptor) callBack;

          ????????????? }

          ???????? }

          ???????? return null;

          ???? }

          }

          這個(gè) JavaBeanInterceptorUtils 只有一個(gè)方法 getInterceptor ,這個(gè)方法用于從一個(gè)被 CGLib 代理的 JavaBean 中取出攔截器 JavaBeanDataChangeInterceptor 。

          前邊提到了, CGLib 實(shí)現(xiàn)攔截的方式就是生成被攔截類的子類,這個(gè)子類實(shí)現(xiàn)了 net.sf.cglib.proxy.Factory 接口,這個(gè)接口中有一個(gè)非常重要的方法 getCallbacks() ,通過(guò)這個(gè)方法我們可以得到所有的攔截器

          4 主程序

          public class MainApp

          {

          ???? public static void main(String[] args)

          ???? {

          ???????? Enhancer enhancer = new Enhancer();

          ???????? enhancer.setSuperclass(PersonInfo.class);

          ???????? enhancer.setCallback(new JavaBeanDataChangeInterceptor());

          ?

          ???????? PersonInfo info = (PersonInfo) enhancer.create();

          ???????? // 對(duì)生成的 JavaBean 做一些初始化

          ???????? info.setAddress(" 地址 1");

          ???????? info.setAge(21);

          ???????? info.setName("tom");

          ?

          ???????? // 得到攔截器

          ???????? JavaBeanDataChangeInterceptor interceptor = JavaBeanInterceptorUtils

          ?????????????????? .getInterceptor(info);

          ???????? // 復(fù)位修改字段記錄集合

          ???????? interceptor.reset();

          ?

          ???????? // 對(duì) JavaBean 做一些修改

          ???????? editPersonInf(info);

          ?

          ???????? // 得到修改了的字段

          ???????? Iterator it = interceptor.getChangedPropSet().iterator();

          ???????? while (it.hasNext())

          ???????? {

          ????????????? System.out.println(it.next());

          ???????? }

          ???? }

          ?

          ???? private static void editPersonInf(PersonInfo info)

          ???? {

          ???????? info.setName("Jim");

          ???????? info.setAddress("N.Y Street");

          ???? }

          }???

          運(yùn)行結(jié)果:

          Address

          Name

          ?

          這個(gè)“變化字段攔截器”是有一定實(shí)際意義的,比如可以用來(lái)實(shí)現(xiàn)“只保存修改了的字段以提高效率”等功能 。

          ?

          很多資料中都說(shuō)如果要使用 JDK Proxy ,被代理的對(duì)象的類必須要實(shí)現(xiàn)接口,這種說(shuō)法是不嚴(yán)謹(jǐn)?shù)摹纳线叺睦游覀兛梢钥闯?,正確的說(shuō)法應(yīng)該是:如果要使用 JDK Proxy ,那么我們要通過(guò)代理調(diào)用的方法必須定義在一個(gè)接口中?!懊嫦蚪涌诰幊潭皇敲嫦?qū)崿F(xiàn)編程”是 OOP 開(kāi)發(fā)中的一條基本原則,因此這種限制并不會(huì)對(duì)我們的開(kāi)發(fā)造成障礙。

          posted @ 2007-02-20 00:50 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(351) | 評(píng)論 (0)編輯 收藏

               摘要: 服務(wù)器通過(guò)配置文件將符合特定格式的 URL 同 Servlet 建立對(duì)應(yīng)關(guān)系,當(dāng)一個(gè)客戶端請(qǐng)求到達(dá)服務(wù)器的時(shí)候,服務(wù)器就會(huì)分析其 URL 格式并派發(fā)給合適的 Servlet 處理,然后將 Servlet 處理完成的結(jié)果返回給客戶。 與 ASP 、 ...  閱讀全文
          posted @ 2007-02-19 21:45 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(792) | 評(píng)論 (0)編輯 收藏

          公司安排偶做終端字符界面庫(kù),這是我半個(gè)月做出來(lái)的東西,呵呵,挺有意思,與大家分享。
          p3.JPG

          這是用這些控件搭建出來(lái)的程序界面,供大家把玩
          p1.JPGp2.JPG
          posted @ 2007-02-13 17:37 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(544) | 評(píng)論 (2)編輯 收藏

          對(duì)象圖
          XStream支持對(duì)象圖,也就是“反序列化”一個(gè)對(duì)象的時(shí)候?qū)?huì)保持原來(lái)的對(duì)象引用關(guān)系,這其中包括循環(huán)引用關(guān)系。?我們可以指定XStream是使用XPath還是IDs來(lái)實(shí)現(xiàn)對(duì)象引用的這種處理方式,指定的方式就是調(diào)用XStream的setMode方法,此方法有XStream.XPATH_REFERENCES、XStream.ID_REFERENCES、XStream.NO_REFERENCES三個(gè)選項(xiàng)。其意義分別如下:
          XStream.XPATH_REFERENCES:這是默認(rèn)值。這個(gè)選項(xiàng)指定XStream使用XPath引用方式處理重復(fù)引用。
          XStream.ID_REFERENCES:這個(gè)選項(xiàng)指定XStream使用ID引用方式處理重復(fù)引用。當(dāng)使用手寫XML的時(shí)候,這種方式可能更好用一些。?
          XStream.NO_REFERENCES:這個(gè)選項(xiàng)指定XStream不支持圖引用,將對(duì)象結(jié)構(gòu)當(dāng)做樹(shù)狀處理。重復(fù)的引用將會(huì)被認(rèn)為是兩個(gè)獨(dú)立的對(duì)象,而循環(huán)引用將會(huì)導(dǎo)致一個(gè)異常。這種方式速度會(huì)更快一些,并且相對(duì)于前兩者來(lái)說(shuō)占用更少的內(nèi)存。
          自定義轉(zhuǎn)換器
          XStream對(duì)String, Date, int, boolean等基本類型以及Map, List, Set, Properties等集合類型提供了轉(zhuǎn)換器,因此這些類型可以輕松的實(shí)現(xiàn)序列化和反序列化。如果您使用的數(shù)據(jù)類型不被XStream支持,那么就需要自定義數(shù)據(jù)轉(zhuǎn)換器。自定義轉(zhuǎn)換器要實(shí)現(xiàn)com.thoughtworks.xstream.converters.Converter接口,這個(gè)接口定義了如下三個(gè)方法:
          boolean canConvert(Class type);
          void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context);
          Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context);
          這三個(gè)方法分別表示:type這個(gè)類型的數(shù)據(jù)此轉(zhuǎn)換器是否有能力轉(zhuǎn)換;將對(duì)象進(jìn)行編組(marshal)為XML格式;將XML格式反編組(unmarshal)為對(duì)象。
          我們通常無(wú)需直接實(shí)現(xiàn)該接口,而是繼承com.thoughtworks.xstream.converters.MarshallingContext.AbstractBasicConverter抽象類,然后覆蓋:
          protected String toString(Object obj)
          protected Object fromString(String str);
          兩個(gè)方法即可??梢詤⒖糲om.thoughtworks.xstream.converters.extended.SqlTimestampConverter的實(shí)現(xiàn)代碼。
          轉(zhuǎn)換器開(kāi)發(fā)完畢以后調(diào)用XStream類的public void registerConverter(Converter converter)方法注冊(cè)轉(zhuǎn)換器。
          posted @ 2007-02-13 09:38 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(823) | 評(píng)論 (0)編輯 收藏

          為什么使用數(shù)據(jù)源
          在帳套配置項(xiàng)中,我們使用數(shù)據(jù)源來(lái)表示對(duì)應(yīng)的數(shù)據(jù)庫(kù)連接。使用數(shù)據(jù)源有兩個(gè)好處:對(duì)開(kāi)發(fā)人員屏蔽數(shù)據(jù)庫(kù)細(xì)節(jié),只要通過(guò)JNDI取得數(shù)據(jù)源就可以了,無(wú)需關(guān)心數(shù)據(jù)庫(kù)連接是如何建立的;數(shù)據(jù)源通常都提供了數(shù)據(jù)庫(kù)連接池的功能。
          數(shù)據(jù)庫(kù)連接是一種關(guān)鍵的有限的昂貴的資源,而且數(shù)據(jù)庫(kù)連接的建立和關(guān)閉也是很耗費(fèi)系統(tǒng)資源的。在傳統(tǒng)的兩層C/S架構(gòu)中,一個(gè)客戶端對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)連接,在用戶活動(dòng)期間就獨(dú)占此連接;而在分布式系統(tǒng)中,數(shù)據(jù)庫(kù)連接的建立與關(guān)閉是異常頻繁的,因此數(shù)據(jù)庫(kù)連接的對(duì)系統(tǒng)的性能影響更是明顯。對(duì)數(shù)據(jù)庫(kù)連接的管理能顯著影響到整個(gè)應(yīng)用程序的伸縮性和健壯性,影響到程序的性能指標(biāo)。數(shù)據(jù)庫(kù)連接池正是針對(duì)這個(gè)問(wèn)題提出來(lái)的。
          數(shù)據(jù)庫(kù)連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫(kù)連接放到連接池中,這些數(shù)據(jù)庫(kù)連接的數(shù)量是由最小數(shù)據(jù)庫(kù)連接數(shù)來(lái)設(shè)定的。數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而再不是重新建立一個(gè);釋放空閑時(shí)間超過(guò)最大空閑時(shí)間的數(shù)據(jù)庫(kù)連接來(lái)避免因?yàn)闆](méi)有釋放數(shù)據(jù)庫(kù)連接而引起的數(shù)據(jù)庫(kù)連接遺漏。無(wú)論這些數(shù)據(jù)庫(kù)連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫(kù)連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請(qǐng)求的連接數(shù)超過(guò)最大連接數(shù)量時(shí),這些請(qǐng)求將被加入到等待隊(duì)列中。
          JDBC3.0規(guī)范中規(guī)定了如下的接口和類來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池:
          javax.sql.ConnectionEvent:連接事件
          javax.sql.ConnectionPoolDataSource:連接池?cái)?shù)據(jù)源
          javax.sql.PooledConnection:被池化的連接
          javax.sql.ConnectionEventListener:連接事件監(jiān)聽(tīng)接口
          上邊這些接口和類是對(duì)數(shù)據(jù)庫(kù)連接池內(nèi)部實(shí)現(xiàn)的規(guī)定,對(duì)于使用者來(lái)說(shuō)是透明的。數(shù)據(jù)庫(kù)連接池的使用者一般只和DataSource接口直接打交道,通過(guò)這個(gè)接口獲得數(shù)據(jù)庫(kù)連接,其主要方法為:
          Connection getConnection():得到一個(gè)數(shù)據(jù)庫(kù)連接
          Connection getConnection(String userName,String password):得到一個(gè)數(shù)據(jù)庫(kù)連接
          java.io.PrintWriter getLogWriter():獲得Log Writer的對(duì)象
          void setLogWriter(java.io.PrintWriter out):設(shè)置Log Writer
          void setLoginTimeout(int seconds):設(shè)置數(shù)據(jù)源嘗試連接數(shù)據(jù)庫(kù)的最大時(shí)間
          int getLoginTimeout():獲得數(shù)據(jù)源嘗試連接數(shù)據(jù)庫(kù)的最大時(shí)間
          開(kāi)源社區(qū)中有很多數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn),比如PoolMan等,使用這些數(shù)據(jù)庫(kù)連接池包可以保證跨應(yīng)用服務(wù)器的移植。不過(guò)在本案例系統(tǒng)中,我們使用應(yīng)用服務(wù)器的數(shù)據(jù)源功能提供的數(shù)據(jù)庫(kù)連接池。數(shù)據(jù)源在不同的服務(wù)器中有不同的配置方式,下面介紹Tomcat中數(shù)據(jù)源的配置。
          打開(kāi)%TOMCAT_HOME%\conf\server.xml,在</Context>和</host>前添加如下配置文件項(xiàng):
          <Context docBase="CowNewPIS" path="/CowNewPIS"??????reloadable="true">
          <Resource type="javax.sql.DataSource"
          ??????auth="Container" name="jdbc/PISMSSQL_Dev" />
          <ResourceParams name="jdbc/PISMSSQL_Dev">
          <parameter>
          <name>maxWait</name>
          <value>5000</value>
          </parameter>
          <parameter>
          <name>maxActive</name>
          <value>4</value>
          </parameter>
          <parameter>
          <name>password</name>
          <value></value>
          </parameter>
          <parameter>
          <name>url</name>
          <value>
          jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=PISDev1106
          </value>
          </parameter>
          <parameter>
          <name>driverClassName</name>
          <value>
          com.microsoft.jdbc.sqlserver.SQLServerDriver
          ????</value>
          </parameter>
          <parameter>
          <name>maxIdle</name>
          <value>2</value>
          </parameter>
          <parameter>
          <name>username</name>
          <value>sa</value>
          </parameter>
          </ResourceParams>
          </Context>
          ?
          在配置的時(shí)候,要指定數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)、數(shù)據(jù)庫(kù)連接URL等。數(shù)據(jù)源配置完畢,重啟服務(wù)器。編寫一個(gè)測(cè)試客戶端:
          Context ctx=null;
          Connection conn=null;
          try
          {
          ctx=new InitialContext();
          DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/PISMSSQL_Dev");
          conn=ds.getConnection();
          }
          finally
          {
          if(conn!=null)
          conn.close();
          if(ctx!=null)
          ctx.close();
          }

          Tomcat啟動(dòng)的時(shí)候會(huì)將Server.xml中的數(shù)據(jù)源配置綁定到JNDI中,我們可以在應(yīng)用服務(wù)器啟動(dòng)的時(shí)候用代碼來(lái)代替Tomcat完成綁定:
          BasicDataSource bdds = new BasicDataSource();
          //設(shè)置數(shù)據(jù)庫(kù)驅(qū)動(dòng)
          bdds.setDriverClassName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
          //設(shè)置JDBC的URL
          bdds.setUrl("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=PISDev1106");
          bdds.setUsername("sa");
          //設(shè)置連接池初始大小
          bdds.setInitialSize(2);?????
          //JNDI配置
          Map env = new Hashtable();
          env.put("java.naming.factory.initial",
          "org.apache.naming.java.javaURLContextFactory");
          InitialContext ctx=new InitialContext(env);?????
          //數(shù)據(jù)源綁定到JNDI
          ctx.bind("jdbc/PISMSSQL_Dev",bdds);

          這樣我們可以把數(shù)據(jù)源的配置文件移到ServerConfig.xml中,增加類似如下的配置:
          <DataSources>
          <DataSource
          name=”jdbc/PISMSSQL_Dev” driverClassName=”com.microsoft.jdbc.sqlserver.SQLServerDriver”
          url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=PISDev1106”
          userName=”sa”
          >
          </DataSource>
          </DataSources>
          在應(yīng)用服務(wù)器啟動(dòng)的時(shí)候,到ServerConfig.xml中讀取數(shù)據(jù)源配置完成綁定。這種方式一是減少了實(shí)施人員配置文件的工作量,服務(wù)端的任何配置都可以在這個(gè)配置文件中完成;二是使得系統(tǒng)在不同服務(wù)器之間移植變得更加容易。

          posted @ 2007-02-13 09:37 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(349) | 評(píng)論 (0)編輯 收藏

          BeanUtils
          BeanUtils是Apache-Commons項(xiàng)目提供的另一個(gè)非常方便的類庫(kù),通過(guò)這個(gè)類庫(kù)能夠更方便的使用反射。最常用的類是BeanUtils(org.apache.commons.beanutils包中),使用這個(gè)類能通過(guò)名字訪問(wèn)一個(gè)Bean中的某個(gè)屬性。
          通過(guò)BeanUtils.getProperty(person,”age”)能得到person的age屬性。此方法還支持內(nèi)嵌對(duì)象,比如BeanUtils.getProperty(person,”manager.name”)就能得到person的manager屬性的name屬性。還支持List和Map類型的屬性,如下面的語(yǔ)法即可取得Order的顧客列表中第一個(gè)顧客的名字BeanUtils.getProperty(orderBean, "customers[1].name")。?使用BeanUtils.setProperty方法則可以設(shè)置javaBean的屬性值。
          ConstructorUtils提供了調(diào)用構(gòu)造函數(shù)的方法,使用public static Object invokeConstructor(Class klass, Object arg)可以直接調(diào)用某個(gè)類的構(gòu)造函數(shù)。
          MethodUtils提供了調(diào)用bean方法的方法,使用MethodUtils.invokeMethod(bean, methodName, parameter);可以直接調(diào)用某個(gè)類的某個(gè)方法。
          PropertyUtils提供了更詳細(xì)的屬性訪問(wèn)方法,使用public static Class getPropertyType(Object bean, String name)獲取屬性的Class類型。
          UserInfo userInfo = (UserInfo) ConstructorUtils.invokeConstructor(
          ????UserInfo.class, new Object[] {});
          PersonInfo personInfo = (PersonInfo) ConstructorUtils
          ????.invokeConstructor(PersonInfo.class, new Object[] {});
          BeanUtils.setProperty(personInfo, "age", new Integer(20));
          BeanUtils.setProperty(personInfo, "name", "Tom");
          BeanUtils.setProperty(userInfo, "number", "admin");
          ??BeanUtils.setProperty(userInfo, "person", personInfo);
          System.out.println(BeanUtils.getProperty(userInfo, "person.name"));
          BeanUtils.setProperty(userInfo, "person.name","xdx");
          System.out.println(BeanUtils.getProperty(userInfo, "person.name"));
          System.out.println(PropertyUtils.getPropertyType(userInfo,"person"));
          運(yùn)行結(jié)果:
          Tom
          xdx
          class com.cownew.PIS.basedata.common.PersonInfo
          posted @ 2007-02-05 12:49 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(768) | 評(píng)論 (1)編輯 收藏

               摘要: LDBC 支持的語(yǔ)法 ( 1 ) Insert 語(yǔ)句 插入單行數(shù)據(jù): INSERT INTO tableName [ (columnName [,...] ) ...  閱讀全文
          posted @ 2007-02-05 12:44 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(573) | 評(píng)論 (0)編輯 收藏

          雖然使用正則表達(dá)式能很好的進(jìn)行字符串的解析、提取、替換,但是對(duì)于一些簡(jiǎn)單的應(yīng)用,使用 String 類提供的一些方法就可以很好的完成,最突出的就是 split 方法。

          split 方法能夠很方便的將字符串按照一定的規(guī)則拆分開(kāi)。

          比如對(duì)于下面的字符串:

          Tom,Jane,Tony,Elva,Gigi

          只要調(diào)用如下的代碼就可以將各個(gè)名字提取出來(lái):

          String value = "Tom,Jane,Tony,Elva,Gigi";

          String[] names = value.split(",");

          for(int i=0,n=names.length;i<n;i++)

          {

          ???? System.out.println(names[i]);

          }

          運(yùn)行結(jié)果:

          Tom

          Jane

          Tony

          Elva

          Gigi

          ?

          看到這個(gè)運(yùn)行結(jié)果,很多人都認(rèn)為 split 方法就是按照給定的字符串對(duì)字符串進(jìn)行拆分,知道碰到了下面的問(wèn)題。

          有一個(gè)字符串:中國(guó) . 北京 . 海淀 . 學(xué)院路。請(qǐng)解析此字符串,并打印輸出“中國(guó) 北京 海淀 學(xué)院路 ”。

          于是寫代碼如下:

          String value = " 中國(guó) . 北京 . 海淀 . 學(xué)院路 ";

          String[] names = value.split(".");

          for(int i=0,n=names.length;i<n;i++)

          {

          ???? System.out.print(names[i]+" ");

          }

          運(yùn)行結(jié)果:

          ?

          對(duì),沒(méi)看錯(cuò)!沒(méi)有任何輸出!

          讓我們來(lái)看看 split 方法的方法簽名吧:

          public String[] split(String regex)

          這里的參數(shù)的名稱是 regex ,也就是 Regular Expression (正則表達(dá)式)。這個(gè)參數(shù)并不是一個(gè)簡(jiǎn)單的分割用的字符,而是一個(gè)正則表達(dá)式,看了 split 方法的實(shí)現(xiàn)代碼就更堅(jiān)定了我們的信心:

          public String[] split(String regex, int limit) {

          ???? return Pattern.compile(regex).split(this, limit);

          }

          split 的實(shí)現(xiàn)直接調(diào)用的 Matcher 類的 split 的方法。讀者已經(jīng)知道,“ . ”在正則表達(dá)式中有特殊的含義,因此我們使用的時(shí)候必須進(jìn)行轉(zhuǎn)義。

          修改代碼如下:

          private static void split2()

          {

          ???? String value = " 中國(guó) . 北京 . 海淀 . 學(xué)院路 ";

          ???? String[] names = value.split("\\.");

          ???? for(int i=0,n=names.length;i<n;i++)

          ???? {

          ???????? System.out.print(names[i]+" ");

          ???? }

          }

          運(yùn)行結(jié)果

          中國(guó) 北京 海淀 學(xué)院路

          posted @ 2007-01-20 23:38 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(2838) | 評(píng)論 (9)編輯 收藏

          CowNewSQL的擴(kuò)展:
          要編寫對(duì)新的數(shù)據(jù)庫(kù)的支持必須首先開(kāi)發(fā)翻譯器,翻譯器必須實(shí)現(xiàn)IMethodTranslator接口,不過(guò)一般只要從BaseMethodTranslator派生即可,BaseMethodTranslator類已經(jīng)提供了標(biāo)準(zhǔn)的SQL的翻譯。因?yàn)榉椒ǖ姆g在BaseMethodTranslator中實(shí)現(xiàn)時(shí)是獨(dú)立到一個(gè)方法翻譯器中的,所以派生類要通過(guò)getMethodTranslator方法提供方法翻譯器,方法翻譯器要實(shí)現(xiàn)IMethodTranslator接口,一般從BaseMethodTranslator派生即可。翻譯器開(kāi)發(fā)完畢,調(diào)用DialectManager類的registerTranslator方法將翻譯器注冊(cè)到系統(tǒng)中。
          CowNewSQL的編譯
          CowNewSQL使用JDK1.5語(yǔ)法編寫的,因此如果要在JDK1.4的平臺(tái)上運(yùn)行必須使用RetroTranslator將二進(jìn)制代碼編織成在JDK1.4下能運(yùn)行的二進(jìn)制代碼。RetroTranslator的使用非常簡(jiǎn)單,在命令行敲入如下指令即可完成代碼編織:
          java -jar retrotranslator-transformer-1.0.7.jar -srcjar F:\資料\寫書(shū)\ZDisk\lib\common\cownewSQLjdk5.jar -destjar F:\資料\寫書(shū)\ZDisk\lib\common\cownewSQLjdk4.jar
          RetroTranslator對(duì)JDK1.5中枚舉等類型的支持是通過(guò)RetroTranslator的運(yùn)行時(shí)包來(lái)實(shí)現(xiàn)的,因此運(yùn)行時(shí)還需要將RetroTranslator的運(yùn)行時(shí)包retrotranslator-runtime-***.jar加入到類路徑中。
          posted @ 2007-01-20 23:36 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(2109) | 評(píng)論 (0)編輯 收藏

          原文:
          http://community.csdn.net/Expert/topic/5294/5294255.xml?temp=.9256861

          匯總我的觀點(diǎn):
          1、大家應(yīng)該理性的看待這個(gè)問(wèn)題,盡管從短期來(lái)看,這種行為會(huì)使大家在短期內(nèi)受害,但是我想為這家公司喝彩,中國(guó)的知識(shí)產(chǎn)權(quán)保護(hù)觀念太淡薄了,也間接導(dǎo)致了國(guó)內(nèi)IT環(huán)境的烏煙瘴氣,利潤(rùn)越來(lái)越低。隨著中國(guó)入世的腳步,國(guó)人的版權(quán)觀念會(huì)逐漸加強(qiáng)的。到那個(gè)時(shí)候國(guó)內(nèi)才會(huì)有一個(gè)良性循環(huán)的環(huán)境。
          2、大家還記得當(dāng)年的打假英雄王海嗎?盡管他是在借著打假賺錢,也被很多人罵,很多人對(duì)他的做法也是嗤之以鼻,可是理性的思考一下,他的行為是不是有積極的意義呢?假如北京美好景象這樣的公司再多一點(diǎn),或者我們每個(gè)公司都像北京美好景象這樣,那么還有人敢盜用別人的東西嗎,還敢隨便用網(wǎng)上下載的圖片嗎,還敢隨便用網(wǎng)上下載來(lái)的軟件包嗎,還敢隨便用盜版軟件搞低價(jià)競(jìng)爭(zhēng)嗎?這樣我們產(chǎn)品的成本提高了,軟件開(kāi)發(fā)的門檻提高了,市場(chǎng)規(guī)范了,那么IT業(yè)規(guī)范化、良性化、規(guī)模化發(fā)展的格局也就離我們不遠(yuǎn)了。
          如果我見(jiàn)了北京美好景象的老總,我會(huì)對(duì)他說(shuō):你真他媽的無(wú)恥,不過(guò)我支持你!
          3、“我們是要強(qiáng)調(diào)版權(quán),但問(wèn)題是有的圖片你從baidu獲取的,你知不知道這個(gè)圖片是不是有版權(quán)?”,你連一點(diǎn)的知識(shí)產(chǎn)權(quán)的觀念都沒(méi)有,悲哀!做商業(yè)開(kāi)發(fā)所用的任何東西,除非是明確表示能被免費(fèi)用于商業(yè)用途,否則你都不能未經(jīng)授權(quán)使用。如果你還不理解的話,希望你想想你去黑市買偷來(lái)的車是合法的嗎?
          4、“不過(guò)他是應(yīng)該在圖片上寫明什么東西的,你這樣不寫,如果你在用別人的東西的時(shí)候,不是也會(huì) 被陷害 嗎”。嚴(yán)格來(lái)說(shuō),你用別人的東西的時(shí)候必須要他證明這個(gè)東西是他合法占有的,并要他書(shū)面授權(quán)你使用。這聽(tīng)起來(lái)有點(diǎn)變態(tài),不過(guò)這正是一個(gè)高度發(fā)達(dá)的法制社會(huì)的最終目標(biāo)。如果你聽(tīng)過(guò)羅永浩的“小心地滑”、“毒藥請(qǐng)勿吞服”那幾段語(yǔ)錄的話,就明白米國(guó)的法治社會(huì)是什么樣的了,我不是崇洋媚外,但是不得不承認(rèn)的是在很多事情上我們和很多國(guó)家還有很大差距。

          總之,支持無(wú)恥的“北京美好景象圖片有限公司”。
          posted @ 2007-01-16 01:06 CowNew開(kāi)源團(tuán)隊(duì) 閱讀(1200) | 評(píng)論 (7)編輯 收藏

          僅列出標(biāo)題
          共30頁(yè): First 上一頁(yè) 15 16 17 18 19 20 21 22 23 下一頁(yè) Last 
          主站蜘蛛池模板: 平湖市| 天等县| 来凤县| 仁化县| 贵阳市| 区。| 承德县| 新乐市| 芷江| 嵊州市| 彭阳县| 亳州市| 普定县| 施秉县| 澄城县| 白河县| 阿克苏市| 常宁市| 远安县| 桂东县| 石台县| 密云县| 洛扎县| 郴州市| 德清县| 米林县| 焦作市| 天气| 文登市| 泾源县| 朝阳县| 红安县| 苗栗市| 扬州市| 惠来县| 渝北区| 阿坝县| 琼结县| 桓仁| 科技| 辛集市|