实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程
2009-11-19 00:00:00 来源:WEB开发网
清单 5. 在 Groovy 中发出一个 shell 命令println "ifconfig en0".execute().text
//output
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:17:f2:cb:bc:6b
media: autoselect status: inactive
//snip
我并没有说 Groovy 的优点在于您不能 使用 Java 语言做同样的事情。您当然可以。Groovy 的优点在于这些方法似乎可以直接添加到 String 类 — 这绝非易事,因为 String 是 final 类。(稍后将详细讨论这点)。清单 6 展示了 Java 中的相应内容 String.execute().text:
清单 6. 使用 Java 语言发出 shell 命令Process p = new ProcessBuilder("ifconfig", "en0").start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = br.readLine();
while(line != null){
System.out.println(line);
line = br.readLine();
}
这看上去有点像在机动车辆管理局的各个窗口之间辗转,不是吗?“对不起,先生,要查看您请求的 String,首先需要去别处获得一个 BufferedReader。”
是的,您可以构建方便的方法和实用类来帮助将这个问题抽象出来,但是惟一的 com.mycompany.StringUtil 替代方法就是使用一个类来代替将方法直接添加到所属位置的行为:String 类。(当然就是 Platypus.layEgg()!)
那么 Groovy 究竟如何做 — 将新方法添加到无法扩展的类,或直接进行修改?要理解这一点,需要了解 closures 和 ExpandoMetaClass。
更多精彩
赞助商链接