Archives

  • 用javac编译生成不同版本的源码和目标class

    合理使用javac的source和target选项, 可以使程序的兼容性得到提升.比如, 你写了某个方法, 命名为assert, 该source能通过1.3编译, 而后, 1.4将assert加入到了关键字列表.
    此时, 你再用1.4编译时, 就会出错了.

    同样地, 1.5之前因为没有引入enum关键字, 如果你的代码中使用了, 那在1.5之后编译就会错误.
    解决这个问题的方法, 就是使用 source 选项. Javac -source 1.3 classFileName.-source 选项, 指定源码版本.

    -target 选项, 指定目标class版本. 如果已经指定了source版本, 那target版本不能低于source.target选项也是一个对javac来说很灵活的设置.
    你可以做到, 用低版本的source编译出高版本的class. 很有趣哦! 不同版本的javac, 默认source与target选项值

    JDK/J2SDK Default Source Source Range Default Target Target Range
    1.0.x 1.0 1.1
    1.1.x 1.1 1.1
    1.2.x 1.2 1.1 1.1 – 1.2
    1.3.x 1.2/1.3 1.1 1.1 – 1.3
    1.4.x 1.2/1.3 1.2? – 1.4 1.2 1.1 – 1.4
    5 1.5 1.2 – 1.5 1.5 1.1 – 1.5
    6 1.5 1.2 – 1.6 1.6 1.1 – 1.6
    7 1.7 1.2 – 1.7 1.7 1.1 – 1.7

    Read more…

    2009/08/06 | Posted in Development Skills
  • 解开 phprpc 序列化性能高于 hessian 的秘密

    Phprpc, 是一个声称在某些场景下, 性能比hessian还要高的协议.
    下面url是javaeye andot 写的两个协议的性能测试报告:

    http://www.javaeye.com/topic/333720

    看到这个报告是有点激动的, 那么它到底在实现上有何高明之处呢?

    在这篇文章里, 我会给大家简单阐述一下, 为什么phprpc在某些场景下, 性能会优于hessian.
    首先, 序列化的本意是, 将不同类型的对象转换成统一的字节流, 便于存储和传输.

    Java在早期1.1版时, 就引入 Serializable 接口, 来支持java对象的序列化(通过ObjectInput/OutputStream写入读取).
    但由于实现上过于通用和复杂, 导致其性能下降得比较厉害.

    Hessian的效率高, 主要体现在针对不同类型的转换逻辑上, 做了大量优化(比如数组, 复合对象, 日期类型等)和协议更轻量级..
    那要比hessian性能还高, 要么就是转换逻辑, 比hessian更简单, 要么就是协议更精简, 代码优化的更好.

    当然猜测是没有用的, 下面, 是我读了源码后, 对比得到的结论:
    Read more…

    2009/03/15 | Posted in Development Skills
  • 我也谈谈guice, 简单就是美

    一直以来, 我都是spring的忠实fans, 使用它也有好几年了.
    看着它从1.0发展到现在的2.5, 给我感觉就是, 长大了, 而且逐渐成为一个成熟的一站式解决方案.

    但有的时候, 我只想要一个ioc容器, 它还合适吗?
    于是焦点定位在了google的guice. 当然轻量级容器有很多, hivemind, picoContainer, plexus 等都不错的, 但是他们生不逢时, guice是在java最重要的几个特性发布后, 才诞生的, 本身设计理念上要好一些.

    选择有以下几点理由:

    1, 它的身材很小, jar包只有500多k.功能上, 是一个纯净的ioc容器, 不会有过多依赖.
    2, 08年获得了jolt award.(不是主要理由)
    3, 性能大幅超越spring.(不过号称spring2.5也提性能了)
    3, 开发调试比较简单, 直接new一个容器, 不需要载入配置文件就可以用了.
    4, 官方文档内容比较精简, 看完应该不需要1个小时, 那么, 学习成本又降低了.
    5, 开发者是google的工程师, 并且google内部大量使用该框架, 维护不成问题.
    6, 基于annotation, 不需要引入配置文件的复杂性, 离代码更近. 当然, annotation存在低侵入性, 这可能是它唯一的缺点.(适用于移植性要求不高或只需对外暴露服务的项目.)
    7, 支持静态注入.

    如果还没看过guice的朋友, 只需要耽误你半个小时, 看看这位网友写得一篇总结, 短小精悍, 总结

    架构设计

    guice injector结构
    Read more…

    2009/02/15 | Posted in Development Skills
  • 用java.io.Console来与字符控制台交互

    JDK6中提供了java.io.Console类专用来访问基于字符的控制台设备.
    你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳.(类似System.in和System.out)
    但我们不总是能得到可用的Console, 一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用.
    如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例。

    Console类还有个特色就是,专门对密码等安全字符,进行了处理。专门提供 readPassword()方法.

    package test;
     
    import java.io.Console;
     
    public class TestConsole {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            Console console = System.console();
            if( console != null ) {
                String user = new String( console.readLine( "Enter User:", new Object[ 0 ] ) );
                String pwd = new String( console.readPassword( "Enter Password:", new Object[ 0 ] ));
                console.printf( "User name is:%s", new Object[]{user} );
                console.printf( "Password is:%s", new Object[]{pwd} );
            } else {
                System.out.println( "No Console!" );
            }
        }
    }
    2008/05/25 | Posted in Development Skills
  • java操作耗时对照表

    操作 代码 耗时(单位时间)
    本地赋值 i=n; 1.0
    实例赋值 this.i=n; 1.2
    int增值 i++; 1.5
    byte增值 b++; 2.0
    short增值 s++; 2.0
    float增值 f++; 2.0
    double增值 d++; 2.0
    空循环 while(true) n++; 2.0
    三元表达式 (x<0) ?-x : x 2.2
    算术调用 Math.abs(x); 2.5
    数组赋值 a[0] = n; 2.7
    long增值 l++; 3.5
    方法调用 funct(); 5.9
    throwcatch异常 try{ throw e; }catch(e){} 320
    同步方法调用 synchMehod(); 570
    新建对象 new Object(); 980
    新建数组 new int[10]; 3100
    2007/12/03 | Posted in Development Skills
  • apache jakarta oro 常用例子(带注释)

    package test;
     
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.apache.oro.text.regex.MalformedPatternException;
    import org.apache.oro.text.regex.MatchResult;
    import org.apache.oro.text.regex.Pattern;
    import org.apache.oro.text.regex.PatternCompiler;
    import org.apache.oro.text.regex.PatternMatcher;
    import org.apache.oro.text.regex.Perl5Compiler;
    import org.apache.oro.text.regex.Perl5Matcher;
    import org.apache.oro.text.regex.Perl5Substitution;
    import org.apache.oro.text.regex.Util;
     
    /**
     * apache oro正则表达式学习
     *
     * @author xiaofeng
     *
     * @create 2007-5-21上午11:42:36
     */
    public class RegexStudy {
        private static final Log log = LogFactory.getLog(RegexStudy.class);
        private PatternCompiler pc = new Perl5Compiler();
        private PatternMatcher matcher = new Perl5Matcher();
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            RegexStudy ps = new RegexStudy();
            ps.substitutePatternTest();
        }
     
        /**
         * 精确匹配表达式
         */
        public void simplePatternTest() {
            Pattern p = null;
     
            //编译一下,生成表达式
            try {
                p = pc.compile("<(([a-z]{2})|([0-9]{2}))>.*", Perl5Compiler.CASE_INSENSITIVE_MASK);
            } catch (MalformedPatternException e) {
                log.error("regex compile error : ", e);
            }
     
            if (null != p) {
                //查看字符串中是否完全匹配表达式p
                if (matcher.matches("<111>adsf", p)) {
                    log.info("matched");
                } else {
                    log.info("not matched");
                }
            }
        }
     
        /**
         * 部分匹配表达式
         */
        public void containsPatternTest() {
            Pattern p = null;
     
            //编译一下,生成表达式
            try {
                p = pc.compile("<(([a-z]{2})|([0-9]{2}))>.*", Perl5Compiler.CASE_INSENSITIVE_MASK);
            } catch (MalformedPatternException e) {
                log.error("regex compile error : ", e);
            }
     
            if (null != p) {
                //查看字符串中是否部分匹配表达式p
                if (matcher.contains("<11>adsf", p)) {
                    log.info("matched");
                    //得到匹配结果
                    MatchResult mr = matcher.getMatch();
                    //输出匹配的第一个子表达式值,从1开始的
                    log.info(mr.group(1));
                } else {
                    log.info("not matched");
                }
            }
        }
     
        /**
         * 根据匹配规则,替换子表达式
         */
        public void substitutePatternTest() {
            Pattern p = null;
     
            //编译一下,生成表达式
            try {
                p = pc.compile("<(([a-z]{2})|([0-9]{2}))>.*", Perl5Compiler.CASE_INSENSITIVE_MASK);
            } catch (MalformedPatternException e) {
                log.error("regex compile error : ", e);
            }
     
            if (null != p) {
                //得到匹配过后,替换掉子表达式值后的字符串
                String result = Util.substitute(
                        matcher,
                        p,
                        new Perl5Substitution("<$1>adsf"), //替换表达式
                        "<11>adsf", //匹配的字符串
                        Util.SUBSTITUTE_ALL //置换所有的
                    );
                log.info(result);
            }
        }
     
    }
    2007/05/21 | Posted in Development Skills
  • jdk1.5常用新特性

    1, 范型
    使用范型, 可以做到方法参数,返回值,集合等都是类型安全的.
    特别是,一个类使用了接口作为专递参数,可使用范型,将其参数进行泛化.
    优点是: 简化变量名,支持多种实现.

    2, 可变参数
    方法中,同类型的多个参数,可以使用如下语法精简.
    public void print(String a,String b,String c)
    变成
    public void print(String… strs)

    3, for each的迭代,简化iterator接口
    针对iterator接口的作用,简化了迭代的代码量.

    List strs = new ArrayList();

    for (String str : strs) {
    //iterator here
    }

    4, 静态引入
    将老的”类.方法”静态引用方式,替换成import进来.
    import static com.java.Test;
    此处Test是静态方法

    5, 自动装箱/拆箱
    针对Integer,Long,Double等包装类型,以后可以直接使用int,long,double
    jdk编译时,会进行转换.

    2006/10/10 | Posted in Development Skills
Archive for the ‘Development Skills’ Category