- 前面通过 在 Java 中使用正则表达式进行后向引用($1,$2...) 讲了在 Java 中使用 JavaScript 和 JRegex 来实现正则表达式的后向分组引用 $1, $2 替换。
自 JDK 1.4 出现正则表达式以来我还真不知道 Java 的正则表达式是可以在替换时用 $1, $2 达成后向分组替换的,所以前一篇表述有些出入的。也就是要实现 JavaScript 中的1<script> 2 var src = "abc def"; 3 var des = src.replace(/(\w+)\s+(\w+)/, "$2 $1"); 4 document.write(des); 5 //输出为: def abc 6</script>
的功能,完全可以不求助于第三方的正则表达式组件库或是通过 ScriptEngine + JavaScript 来实现,在 Java 字符串的:
public String replaceFirst(String regex, String replacement)
public String replaceAll(String regex, String replacement)
两方法的第三个参数中是可以用 $1, $2 ... 来引用第一个参数的括号分组的,简单 Java 示例代码如下:1"abc def".replaceFirst("(\\w+)\\s+(\\w+)", "$2 $1"); //结果为 def abc 2"abc def aaa bbb".replaceAll("(\\w+)\\s+(\\w+)", "$2 $1"); //结果是 def abc bbb aaa
Java 的正则表达式原本还是很强大的,只怕不能被人发现。
2015-07-14: 补充一点,在正则表达式外是用 $1, $2 ... 来进行后向引用,如果是在正则表达式中就需要用 \1, \2 ... 的形式来进后向引用。下面例子,替换重复出现的两位数及之间的内容1"xx12abcd12345".replaceAll("(\\d{2}).+?\\1", ""); //结果为 xx345 - ReflectASM 使用字节码生成的方式实现了更为高效的反射机制。执行时会生成一个存取类来 set/get 字段,访问方法或创建实例。一看到 ASM 就能领悟到 ReflectASM 会用字节码生成的方式,而不是依赖于 Java 本身的反射机制来实现的,所以它更快,并且避免了访问原始类型因自动装箱而产生的问题。
下面三个图是 ReflectASM 与 Java 自身反射机制的性能对比,表现很不错的。


测试代码包含在项目文件中. 上面图形是在 Oracle 的 Java 7u3, server VM 下测试出的结果。
下面我们自己来做个测试,测试环境是 Mac OS X 10.8, 2.4G Core 2 Duo, 4G RAM, 64 位 JDK 1.6. Read More - 通常在使用 AspectJ 时都是基于识别方法的规则来进行方法拦截,例如切片里这样写
@Pointcut("execution(* *..StockService.getBaseInfo(..))")它拦截到的是以 StockService 结尾的,方法名为 getBaseInfo,参数任意,返回值任意的方法。而我这里要说的一种方式是基于自定义注解来拦截方法的,此处的注解不是指 @Aspect, @Pointcut, 或 @Before 那一堆东西,而是指你可以自定义一个注解,如 @cc.unmi.testaspectj.MonitorMethod,被它所注解的方法即被拦截,像:
@cc.unmi.testaspectj.MonitorMethod
public void foo();
这可以给我们很大的自由度来快捷控制哪些方法需要被拦截,加个上面的注解 @MonitorMethod 即可,而不像从前那般要想像用什么规则去匹配某个方法,用 || 连接起来,同时还要防止影响到别的不期望被拦截的方法。
需要的代码并不多,四步,创建自定义注解类 MonitorMethod, 需被拦截的方法加上 @MonitorMethod,方面类,测试类。 Read More - 还是在很久以前,作过一篇 用 AOP 来记录每个方法的执行时间(Spring 或直接 AspectJ), 其中例示了三种方法来拦截方法,用以监测方法调用时间它们分别是:
1. Spring 2.0 用 AspectJ 实现 AOP
2. Spring 通用的方法拦截
3. 直接用 AspectJ 实现
在这里再次使用 <aop:aspect-autoproxy/> 再 @Aspect 注解的方式来写个新的例子。原理与前面基本一致,只是在类里用 @Aspect, @Pointcut, @Before, @After, @Around, @AfterReturning, @AfterThrowing 来写拦截类。
局限仍然是必须通过 Spring 的 BeanFactory 获得的实例才能被拦截到,除非是在 Eclipse 里安装 AJDT 或是使用 Maven-AspectJ Plugin 来编译工程。
好,我们来看完整的例子,下面列出所有的项目文件,这是一个 Maven 的项目,所以从 pom.xml 开始。 Read More - 当你在 Mac OS X 下启用了 Web Sharing,其实就是 Apache2 服务, 到浏览器里访问 http://localhost/~{username} 时提示
Forbidden
You don't have permission to access /~{username}/ on this server.
{username} 代表当前系统用户名。
看到上面的问题,首先会想到的是目录下 /Users/{username}/Sites 下的文件权限问题,有可能,但我碰到的问题不是这样的。
而是需要在目录 /etc/apache2/users 创建一个文件 {username}.conf,如 Unmi.conf,甚至可以任意文件名,文件内容如下:1<Directory "/Users/{username}/Sites/"> 2 Options Indexes MultiViews 3 AllowOverride AuthConfig Limit 4 Order allow,deny 5 Allow from all 6</Directory>
Read More - 在网页的 Document 中如果想要获得某个结点的 innerHTML 就行,而在 Java 处理 XML 文档时想要获得某个节点的的 innerXML 就没那么简单的,标准的 org.w3c.Element 和 org.w3c.Node 均未提供类似 innerXML 的方法。
幸好,我们常用的 dom4j 里的 org.dom4j.Node 有一个方法是 String asXML(),不过它的意义相当于是 outerXML,也就是说它返回的内容还包括节点本身。
比如有这么在个 XML 文档:1<BookList> 2 description of book 1 3 <Book id="1">Unmi</Book> 4</BookList>
Read More - Mac 自带了 Dictionary, 你可以给它安装丰富的字典,中文的或各种其他领域和语言的。安装方法如下:
1. 下载 词典的转换程序 DictUnifier,并执行它
2. 下载 StarDict 词典. 目前可从 http://abloz.com/huzheng/stardict-dic/ 处选择您需要的词典
3. 下载完成之后, 把下载的压缩包直接拖到 DictUnifier 界面上转换.
4. 打开 Dictionary,在它的 Cmd + , 进入的 Preferences 配置界面中就可以选入新安装的字典
完工! - 其实不必使用 WiFi ADB 连接的方式,Google USB Driver 说不兼容是因为 Mac 根本用不着这个就能直接连手机,可以用 USB 直接连接 Android 手机进行调试。大家可点击看这个
Mac OS X 下开发 Android 程序时使用 WiFi ADB 连真机调试
可忽略掉下面的内容。
我在 Mac OS X 下用 Eclipse 开发 Android 程序,当自己的 Android 手机插上电脑上是检测试不到的,不能想在 Windows 下那样,开启了 连接 USB 调试模式 就能在启动程序的的时候可选手机来调试或测试代码。
在 Mac 下的 Android SDK Manager 中其实也明确显示了
Google USB Driver Not compatible with Mac OS X
也就是无法即插即用了,那么在 Mac 下该如何联接真机来调试或测试程序呢?
有些地方的解决办法是,把手机的 USB 调试选项关掉,启用 USB 数据存储,把 Eclipse 生成的 APK 文件拷到手机的存储卡。手机上再自行安装,而且先得到 USB 数据存储项关掉后手机才能读取存储卡上的内容。
上面那样做只是告诉了你怎么把 APK 程序安装到手机上,还不如通过网络安装方便,并且肯定是不能联机单步调试。
相信还是不少人在 Mac 下开发 Android 程序的,定然会有更好的解决办法,那就是: Read More - Android 既然是开源的,那么我们开发时自然会想要得到一份它的源代码,这大大有助于我们更好的深入理解这个平台,更快捷的定位程序出错的根源。当然对于国内那些想自主研发 Mobile OS 的厂商来说,下载 Android 源码是步骤是不可或缺的。
我在标题中为什么要加上说是适合于各种平台呢,因为大概不少的地方都专门说在 Linux 下怎么去下载 Android 源代码,好说 Windows/Mac 下就不是那么回事似的,其实并无区别。
官方在说明怎么下载 Android 源代码(http://source.android.com/source/downloading.html) 的解说中也挺啰嗦的,不光要 git,还要 repo sync 来同步。
其实不管是什么平台,只要有 git 客户端就行了。想要下载哪个版本的 Android 源码,先在浏览器里打开 https://android.googlesource.com/platform/frameworks/base,就能看到在 Tags 下有什么版本的源码可下载。如图: Read More 本篇讲述如何在 JUnit 4 下正确测试异常,我会从 try..catch 的方式谈起,然后说到 @Test(expected=Exception.class), 最后论及 @Rules public ExpectedException 的实现方式,最终基本可确定用 @Rules 是最方便的。
我们在用 JUnit 测试方法异常的时候,最容易想到的办法就是用 try...catch 去捕获异常,需要断言以下几个条件:
1. 确实抛出的异常
2. 抛出异常的 Class 类型
3. 抛出异常的具体类型,一般检查异常的 message 属性中包含的字符串的断定所以常用的代码你可能会这么写:
1@Test 2public void passwordLengthLessThan6LettersThrowsException(){ 3 try{ 4 Password.validate("123"); 5 fail("No exception thrown."); 6 }catch(Exception ex){ 7 assertTrue(ex instanceof InvalidPasswordException); 8 assertTrue(ex.getMessage().contains("contains at least 6")); 9 } 10}这里被测试的方法是 Password.validate() 方法是否抛出了相应的异常,注意这里别漏 try 中的
fail("No Exception thrown.") Read More