Я пытаюсь использовать файл .properties, чтобы получить список строк и преобразовать их в массив, который будет добавлен с помощью javassist позже в моей программе. Тем не менее, я продолжаю получать arrayoutofboundsexception 0 со следующими данными в свойствах: modify.spells.in.
void configure(Properties options)
{
String nameSpace;
ArrayList<String> spellList = new ArrayList<String>();
String[] tokens;
for(String key : options.stringPropertyNames()) {
if(key.startsWith("modify.spells.in.")) {
nameSpace = key.substring(17);
tokens = options.getProperty(key).split(",");
for(String token : tokens) {
if(spellList.contains(nameSpace + "." + token)) {
continue;
}
spellList.add(nameSpace + "." + token);
}
}
}
if(spellList.size() == 0) {
itemSpells = new String[]{
"Fire1", "Fire2", "Fire3", "Lit1", "Lit2", "Lit3", "Ice1", "Ice2",
"Ice3"
};
for(int i = 0; i < itemSpells.length; i++) {
itemSpells[i] = "com.ragdoll.spells." + itemSpells[i];
}
} else {
itemSpells = spellList.toArray(new String[0]);
}
Строка файла свойств выглядит следующим образом: modify.spells.in.com.ragdoll.spells = Fire3, Lit3, Ice3
Выражение для редактирования существующего кода выглядит следующим образом:
У меня есть HookManager для добавления в interceptSpells (itemSpells);
private void interceptSpells(String[] classes) throws NotFoundException, CannotCompileException
{
CtClass c;
ClassPool cp = HookManager.getInstance().getClassPool();
CtMethod m = null;
// CAST -
for(int i = 0; i < classes.length; i++) {
final int j = i;
c = cp.get(classes[i]);
m = c.getDeclaredMethods("doEffect")[0];
m.instrument(new ExprEditor() {
public void edit(MethodCall m) throws CannotCompileException {
if (m.getMethodName().equals("addSpellEffect")) {
logger.info("Intercepting (1) " + classes[j]);
m.replace(
"$_ = $proceed($$);"
+ "com.rev.spellmod.getInstance().addSpellEffectCaster($0, eff, performer); "
);
} else if(m.getMethodName().equals("improvePower")) {
logger.info("Intercepting (2) " + classes[j]);
m.replace(
"$_ = $proceed($$);"
+ "com.rev.spellmod.getInstance().replaceSpellEffectCaster($0, eff, performer); "
);
}
}
});
I мне кажется, что я объявил пространство имен и правильно делю список. Если я добавлю только одно заклинание в файл .properties, оно будет работать. Как только я добавляю более одного, он указывает на код перехвата с массивом out ofboundsexception. Если я оставлю это поле пустым, оно также будет работать с заранее определенными заклинаниями, но я надеялся, что смогу изменить заклинания на go, а не перекомпилировать каждый раз.
Любые мысли или помощь будут оценили!