【问题标题】:Groovy: Proper way to create/use this classGroovy:创建/使用此类的正确方法
【发布时间】:2018-08-21 23:15:02
【问题描述】:

我正在加载一个 groovy 脚本,我需要以下类:

import java.util.function.Function
import java.util.function.Supplier

class MaskingPrintStream extends PrintStream {


    private final Function<String,String> subFunction
    private final Supplier<String> secretText

    public MaskingPrintStream(PrintStream out, Supplier<String> secretText, Function<String,String> subFunction) {
        super(out);
        this.subFunction = subFunction;
        this.secretText = secretText;
    }

    @Override
    public void write(byte b[], int off, int len)  {
        String out = new String(b,off,len);
        String secret = secretText.get();
        byte[] dump = out.replace(secret, subFunction.apply(secret)).getBytes();
        super.write(dump,0,dump.length);
    }
}

现在我将它保存在一个名为 MaskingPrintStream.groovy 的文件中。但是,通过这样做,我只能将这个类作为默认创建的与文件名对应的类的内部类来访问。

想要工作的是更像这样的代码:

def stream = evaluate(new File(ClassLoader.getSystemResource('MaskingPrintStream.groovy').file))

但正如您所见,我需要在它准备好之前给它一些值。也许我可以将该类加载到 JVM 中(不确定如何从另一个 groovy 脚本中加载),然后以老式方式实例化它?

另一个问题是:我如何设置它,这样我就没有这种嵌套的类排列?

【问题讨论】:

    标签: groovy


    【解决方案1】:

    groovy.lang.Script#evaluate(java.lang.String) 的用途有点不同。

    对于您的情况,您需要使用groovy.lang.GroovyClassLoader,它能够从源代码解析 groovy 类,编译并加载它们。这是您的代码示例:

    def groovyClassLoader = new GroovyClassLoader(this.class.classLoader) // keep for loading other classes as well
    groovyClassLoader.parseClass('MaskingPrintStream.groovy')
    
    def buf = new ByteArrayOutputStream()
    def maskingStream = new MaskingPrintStream(new PrintStream(buf), { 'secret' }, { 'XXXXX' })
    maskingStream.with {
        append 'some text '
        append 'secret '
        append 'super-duper secret '
        append 'other text'
    }
    maskingStream.close()
    
    println "buf = ${buf}"
    

    以及它在 bash shell 中产生的输出:

    > ./my-script.groovy
    buf = some text XXXXX super-duper XXXXX other text
    

    【讨论】:

    • 这不仅是我需要的答案,而且还解决了我的其他一些谜团!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多