Код, специфичный для JSR-75 на устройствах, отличных от JSR-75?

Что я пытаюсь сделать

Я кодирую мидлет J2ME и хочу использовать JSR-75 для записи файлов. Я также хочу иметь возможность запускать свое приложение на устройстве, которое не поддерживает JSR-75.

Как я это делаю

Я нашел веб-сайт, на котором объясняется, как это сделать (забыл URL-адрес, извините):

  • Создайте общедоступный абстрактный класс («Сервис»), который предоставляет все функциональные возможности.
  • Создайте частный класс пакета («ServiceImplementation»), расширяющий этот абстрактный класс, реализующий все функции.
  • Поместите оба в отдельный пакет, визуализируя Service фасад для пакета.

Для создания экземпляра этого класса используется следующий метод абстрактного класса:

public static Service getInstance() {
    try {
        Class.forName("javax.microedition.io.file.FileConnection");
        Class c = Class.forName("my.package.Service");
        Service service = (Service) (c.newInstance());
        return service;
    } catch (Exception e) {
        return null;
    }
}

Что пошло не так

Это отлично работает, когда присутствует JSR-75. Проблема в том, что я хочу, чтобы этот мидлет запускался и на устройствах, отличных от JSR-75, и этот код выдает исключение ClassNotFoundException: javax / microedition / io / file / FileConnection, когда я пытаюсь это сделать, хотя я улавливаю все исключения .

Я провел поиск по всему проекту, чтобы убедиться, что я не использую FileConnection где-либо еще, кроме Service и ServiceImplementation.

Кто-нибудь знает, как я должен это делать?


person user299056    schedule 22.03.2010    source источник
comment
Выполнения Class.forName () достаточно, чтобы выбросить ClassNotFoundException, поскольку он пытается загрузить класс для создания объекта Class.   -  person michael aubert    schedule 22.03.2010
comment
Конечно, но поскольку я перехватываю все исключения, это не должно вызывать остановку приложения из-за этого исключения.   -  person user299056    schedule 23.03.2010


Ответы (2)


Слегка запутался в том, что вы делаете, особенно с двумя классами в разных пакетах, оба называются Service! Но я столкнулся с этой проблемой при написании кода для работы на телефонах как с определенными JSR, так и без них.

Вы ссылаетесь на классы JSR-75 в своем классе обслуживания? Я подозреваю, что даже если вы не создаете экземпляр класса Service, он все равно загружается. Затем JVM сталкивается с этими классами, которых нет.

Переместите все ссылки на классы JSR-75 в класс, на который ссылается класс Service.

person funkybro    schedule 22.03.2010
comment
Я уже этим занимаюсь. У меня есть только один класс с именем Service и один с именем ServiceImplementation, оба в одном пакете. Последний является частным для пакета, и это единственный класс, в котором я ссылаюсь на классы JSR-75. В любом случае, теперь это решено. Я просто не понимаю, почему исключение, которое должно было быть перехвачено, все еще генерировалось, вызывая остановку приложения. - person user299056; 23.03.2010
comment
Ссылается ли Service (доступ со всех телефонов) на ServiceImplementation (который ссылается на JSR-75)? Попробуйте переместить ссылки JSR-75 в другой класс, на который ссылается только ServiceImplementation. - person funkybro; 23.03.2010
comment
Ничто напрямую не ссылается на ServiceImplementation. Единственная ссылка находится в Службе, а именно: Class.forName (my.package.ServiceImplementation) .newInstance (). Но, как вы можете видеть в комментариях к моему собственному ответу, теперь он работает. - person user299056; 24.03.2010

По-видимому, я могу использовать это:

System.getProperty("microedition.io.file.FileConnection.version");

Если это возвращает значение null, JSR-75 не поддерживается. Если он возвращает что-то еще, это так.

person user299056    schedule 22.03.2010
comment
Оба подхода должны работать. Если вы замените, попробуйте {Class.forName (javax.microedition.io.file.FileConnection); ... и т.д. в приведенном выше коде с if (System.getProperty (microedition.io.file.FileConnection.version)! = null) {... все ли работает нормально? - person funkybro; 23.03.2010
comment
Да, этот подход работает. Я хотел принять свой ответ как принятый, но мне нужно подождать еще 5 часов ... - person user299056; 24.03.2010