Разве CF не поддерживает конструкторы Java с переменным числом аргументов и какие-либо известные обходные пути?

У нас есть проект, который занимается файлами различных кодировок. Я использую BOMInputStream, чтобы пропустить маркеры порядка следования байтов UTF-8. Существующий код работает, но он также должен поддерживать варианты UTF-16. Самый простой подход — передать конструктору BOMInputStream несколько маркеров ByteOrderMarkers.

По документации...

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

В подписи конструктора используются переменные аргументы:

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 ).

Я также пробовал только один аргумент спецификации и получаю ту же ошибку с меньшим количеством аргументов в ошибке. Таким образом, оказывается, что CF не может вызывать конструкторы Java с неограниченным количеством аргументов. Правильно ли это, и если да, то есть ли какие-либо известные обходные пути?


person Dan Roberts    schedule 11.06.2019    source источник


Ответы (1)


Конечно, в тот момент, когда я публикую идею, ко мне приходит идея. Похоже, что доступ к этим переменным осуществляется через массив в вызываемом объекте Java. Я просто изменил код CF, чтобы передавать массив спецификаций вместо отдельных аргументов, и он работал, как и ожидалось.

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