【问题标题】:Is it possible to automatically preload user classes into the groovy interpreter?是否可以将用户类自动预加载到 groovy 解释器中?
【发布时间】:2010-06-27 23:14:16
【问题描述】:

有什么方法可以在groovy解释器中自动加载用户类,System.out是自动加载的(所以你不必导入System.out来使用println)?我希望能够编写使用自定义类的脚本并在 groovy 解释器中运行脚本,而不必一直 import 所有类。

【问题讨论】:

    标签: groovy


    【解决方案1】:

    是的,您只需要创建一个 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 脚本解释器(groovy)做同样的事情,还是只对 groovysh 有效?
    【解决方案2】:

    Groovy 向 Object 添加了一些方法,包括您期望在 printWriters 上使用的方法,例如 printlnprintf。他们隐式使用 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 相同的方式可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 2014-01-12
      相关资源
      最近更新 更多