Вопрос по исполнению кода JVM"ом или интеграция без сложностей

Версия Minecraft
Любая
699
9
53
Допустим есть код:
if(isModLoaded(такойто мод)){//проверка на то загружен ли мод 
операции с тем модом
}

Собсна вопрос: Будет ли JVM ругаться если этого мода не будет но при этом получается что код не выполняется?
Заранее объясню операции я буду проводить без импортов т.е. ИмяПакетаТогоМода.ИмяЕщёОдногоПакета.ИмяКласса внутри if'а.
Поясню, компилятор ругаться не будет ибо компилить буду с модом с которым буду интегрироваться.
Если так не получится подскжите другой способ интеграции с модом(именно интеграции т.е. добавлять что-то, если есть какой-то мод, а не зависимость от мода)
 
Nikitatik написал(а):
Заранее объясню операции я буду проводить без импортов т.е. ИмяПакетаТогоМода.ИмяЕщёОдногоПакета.ИмяКласса внутри if'а.

Это не имеет смысла: все импорты по сути синтаксический сахар, то есть в .class файлах никак не отражено, были полные названия используемых классов прописаны в импортах или прямо в коде.

Сам подход вполне правильный, но я бы советовал выносить в отдельные классы код, которому нужны сторонние моды. Если никогда не обращаться к этим классам в случае отсутствия нужного мода, то вероятность неожиданных NoClassDefFoundError'ов будет сведена к нулю. Например:
Код:
import somepacket.somemod.SomeMod;

void doSomething() {
  if (Loader.isModLoaded("SomeMod")) {
    SomeModHelper.doSomethingWithMod();
  }
}

// этот класс никогда не будет инициализирован, если нет нужного мода
private static class SomeModHelper {
  void doSomethingWithMod() {
    SomeMod.foo();
  }
}

В большинстве случаев это перестраховка, но проще запомнить подход и не задумываясь его использовать, чем досконально разбираться в правилах загрузки классов или гадать, упадёт оно или нет.
 
Я сделал всё ещё хуже. Использовал рефлексию. И обернул в try catch все необходимые вызовы.
Ещё не одной проблемы не было. Конечно использовал, не напрямую, а через String то ещё извращение, насколько помню драйвер к мускулю так же подключается.
 
AlexSocol написал(а):
Когда лень включать классы в проект или делаешь независимую поддержку без рефлексии не обойтись хд
не забывай про @Optional аннотации, если будешь делать что-то с интеграцией

UP'чхи, и можно поподробнее про эту аннотацию.
 
cpw.mods.fml.common.Optional
И читай комменты.

Пример:
@Optional.Method("thaumcraft")//Метод, помеченный этой аннотацией будет существовать, если в сборке есть мод с modid="thaumcraft"
 
Назад
Сверху