【发布时间】:2010-06-27 23:14:16
【问题描述】:
有什么方法可以在groovy解释器中自动加载用户类,System.out是自动加载的(所以你不必导入System.out来使用println)?我希望能够编写使用自定义类的脚本并在 groovy 解释器中运行脚本,而不必一直 import 所有类。
【问题讨论】:
标签: groovy
有什么方法可以在groovy解释器中自动加载用户类,System.out是自动加载的(所以你不必导入System.out来使用println)?我希望能够编写使用自定义类的脚本并在 groovy 解释器中运行脚本,而不必一直 import 所有类。
【问题讨论】:
标签: groovy
是的,您只需要创建一个 profile/rc 文件。只需在 ~/.groovy/groovysh.profile 创建一个文件并将您的导入文件放在那里。您还需要确保您想要包含的任何其他类都是 CLASSPATH 的一部分。
例如:~/.groovy/groovysh.profile:
import org.apache.commons.lang.StringUtils
println "in groovysh.profile"
然后运行 groovysh 并使用 StringUtils 中的方法:
% groovysh
in groovysh.profile
Groovy Shell (1.7.3, JVM: 1.6.0_20)
Type 'help' or '\h' for help.
---------------------------------------------------------------------------------------------------------------------------------
groovy:000> StringUtils.isWhitespace(" ")
===> true
groovy:000>
您可以看到导入已就位(并且它还打印了我在配置文件中的 println。此示例仅在您的类路径中有 commons-lang jar 文件时才有效。
查看the Groovy Shell页面了解更多详情。
【讨论】:
Groovy 向 Object 添加了一些方法,包括您期望在 printWriters 上使用的方法,例如 println 和 printf。他们隐式使用 System.out。如果感觉 System.out 全球可用,这实际上就是 groovy 的表现。
如果您想默认导入一组类,以便在不指定完整包名的情况下使用它们,则适用 Ted 关于 groovysh.profile 的评论。
但是,如果您想要一个特定的对象,例如 System.out,全局可用,以便可以在不引用该对象的情况下调用其方法,那么您可以向 Object 添加一些动态方法。例如,使默认全局 JDK 记录器的记录方法全局可用:
Object.metaClass.info = { String message ->
java.util.logging.Logger.global.info(message)
}
Object.metaClass.warning = { String message ->
java.util.logging.Logger.global.warning(message)
}
Object.metaClass.severe = { String message ->
java.util.logging.Logger.global.severe(message)
}
etc...
一旦将这些方法应用于基本 Object 元类,任何对象都可以调用 info("message") 并将其记录下来,从而有效地使 Logger.global 以与 System.out 相同的方式可用。
【讨论】: