Изменение функциональности класса Java ImageIO - PullRequest
2 голосов
/ 31 января 2012

Я работал с

javax.imageio.ImageIO class

Класс, предоставленный Sun, не поддерживает чтение файлов .tif.Поэтому, если я пытаюсь прочитать файл .tif, он просто возвращает ноль.Затем я скачал этот API с веб-сайта оракула и включил его в classpath.Этот API использует jni, как было видно из файла .so в этой папке.После этого мне не пришлось ничего менять в моем коде, и это работало.Как такое могло произойти?Разве имена классов не конфликтовали бы?

В API, которое я скачал, было 3 вещи:

  1. clibwrapper_jiio.jar
  2. jai_imageio.jar
  3. libclib_jiio.so

Мне не нужно было делать никакого дополнительного импорта.Фактически, функциональность, предоставляемая классом ImageIO, была расширена

Мне действительно любопытно, как это работает.

Вот класс в пакете javax.imageio.Класс был объявлен как окончательный.И это делает некоторые странные сложные вещи, которые я не могу понять.Может кто-нибудь объяснить, как добиться этого эффекта на более простом примере.

http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html

Ответы [ 2 ]

4 голосов
/ 31 января 2012

ImageIO имеет метод scanForPlugins(...). Я полагаю, что во время загрузки класса он просматривает CLASSPATH и ищет все, что может расширить его функциональность.

Javadoc, который намекает на это, находится здесь .

Вы могли бы сделать нечто подобное, поместив статический блок в один из ваших классов

public class MyClass {

  public static scanForExtensions() {
    ... code looking for extensions goes here ...
    ... for each found extension, register them in the "ExtensionRegistry"
    ExtensionRegistry.register(extension);
  }

  static  {
    scanForExtensions();
  }

  public void doSomething(String input) {
    for (Extension extension : ExtensionRegistry.getExtensions()) {
      if (extension.canHandle(input)) {
        extension.handle(input);
        return;
      }
    }
    throw UnhandledInputException("No extension to handle " + input);
  }

}
2 голосов
/ 31 января 2012

Java IO Image работает с использованием интерфейса поставщика услуг (подробности см. По ссылкам ниже).

JavaSound работает так же.Чтобы добавить поддержку (например) MP3 в JavaSound, необходимо только добавить mp3plugin.jar JMF к пути к классам времени выполнения, тогда JavaSound может декодировать файлы MP3 так же легко, как и WAV (используя точныйте же классы - очень прикольный).

Я ожидаю, что установка JAI сделала то же самое, добавив группу поставщиков услуг для разных типов изображений в каталог lib JRE.

  1. ImageWriterSpi
  2. Создание расширяемых приложений с платформой Java .
...