【问题标题】:Does CF not support Java constructors with variable number of arguments and any known workarounds?CF 是否不支持具有可变参数数量和任何已知解决方法的 Java 构造函数?
【发布时间】:2019-06-12 19:30:19
【问题描述】:

我们有一个处理各种编码文件的项目。我正在使用 BOMInputStream 跳过 UTF-8 字节顺序标记。现有代码有效,但还需要支持 UTF-16 变体。最直接的方法是向 BOMInputStream 构造函数传递多个 ByteOrderMarkers。

根据文档...

BOMInputStream bomIn = new BOMInputStream(in,
                               ByteOrderMark.UTF_16LE,
                               ByteOrderMark.UTF_16BE,
                               ByteOrderMark.UTF_32LE,
                               ByteOrderMark.UTF_32BE);

构造函数签名使用variable arguments:

public BOMInputStream(InputStream delegate,
          ByteOrderMark... boms)

但是,当我尝试使用以下代码调用此构造函数时

<cfset var fis = createObject("java", "java.io.FileInputStream").init(arguments.filePath) />
<cfset var boms = createObject("java", "org.apache.commons.io.ByteOrderMark") />
<cfset var bomins = createObject("java", "org.apache.commons.io.input.BOMInputStream").init(fis, boms.UTF_8, boms.UTF_16LE, boms.UTF_16BE) />

我收到以下错误...

Unable to find a constructor for class org.apache.commons.io.input.BOMInputStream that accepts parameters of type ( java.io.FileInputStream, org.apache.commons.io.ByteOrderMark, org.apache.commons.io.ByteOrderMark, org.apache.commons.io.ByteOrderMark ).

我也只尝试了一个 BOM 参数,并得到相同的错误,但错误中的参数更少。因此,CF 似乎无法调用具有无限参数的 Java 构造函数。这是否正确,如果正确,是否有任何已知的解决方法?

【问题讨论】:

    标签: coldfusion coldfusion-2016 apache-commons-io


    【解决方案1】:

    当然,当我发布一个想法时,我就会想到。看起来这些变量是通过被调用的 Java 对象中的数组访问的。我只是更改了 CF 代码以传递 BOM 数组而不是单个参数,它按预期工作。

    <cfset var bomins = createObject("java", "org.apache.commons.io.input.BOMInputStream").init(
        fis, 
        [boms.UTF_8, boms.UTF_16LE, boms.UTF_16BE]
    ) />
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2012-03-20
    相关资源
    最近更新 更多