Java Массив вне границ Исключение из свойств - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать файл .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, а не перекомпилировать каждый раз.

Любые мысли или помощь будут оценили!

1 Ответ

0 голосов
/ 30 апреля 2020

Я понял, что проблема в doEffect. Некоторые из заклинаний унаследовали doEffect от другого класса, и это создавало исключение ArrayOutOfBoundsException, а не разбор строки, которая была правильной.

...