ClassNotFoundException при попытке использовать snakeyaml loadAs (FileStream, MyClass.class) - PullRequest
0 голосов
/ 11 ноября 2019

Проблема в том, что когда FDevTools (компилятор плагинов и загрузчик плагинов для [nukkit] https://github.com/NukkitX/Nukkit) пытается найти класс, он возвращает соответствующую ошибку, потому что класс не существует, но я непонять, почему класс вообще ищется в первую очередь ??

вот соответствующая строка, которая выдает ошибку в FDevtools https://github.com/jasin/FDevTools/blob/master/src/main/java/moe/berd/FDevTools/SourcePluginClassLoader.java#L41

два класса, которые пытаются загрузить:

jasin.mcmmo.datatypes.player.PlayerProfileBeanInfo
jasin.mcmmo.datatypes.player.PlayerProfileCustomizer

Я пробовалвыяснить, где имя класса генерируется безрезультатно.

Код вызова с использованием snakeyaml

public class FlatFileDatabase implements Database {

    private String path;

    public FlatFileDatabase(String path) {
        this.path = path;
    }

    public PlayerProfile loadPlayerProfile(String name, UUID uuid, boolean create) {
        PlayerProfile profile = new PlayerProfile();
        File file = new File(this.path + File.separator + name);
        PlayerProfileRepresenter representer = new PlayerProfileRepresenter();
        Yaml yaml = new Yaml(new CustomClassLoaderConstructor(FlatFileDatabase.class.getClassLoader()));

        if(file.exists()) {
            try {
                profile = yaml.loadAs(new FileInputStream(file), PlayerProfile.class);
            } catch(Exception e) {
                System.out.println(e);
            }
        } else if(create) {
            try {
                profile.setName(name);
                profile.setUUID(uuid.toString());
                FileWriter writer = new FileWriter(file, false);
                yaml.dump(profile, writer);
            } catch(Exception e) { }
        }

        return profile;
    }

    private class PlayerProfileRepresenter extends Representer {
        @Override
        protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) {
            if("loaded".equals(property.getName())) {
                return null;
            } else {
                return super.representJavaBeanProperty(javaBean, property, propertyValue, customTag);
            }
        }
    }
}
package jasin.mcmmo.datatypes.player;

import cn.nukkit.Player;

import java.beans.*;

public class PlayerProfile {

    public String name;
    public String UUID;
    public boolean loaded;
    //private Player player;

    public PlayerProfile() {}
    public PlayerProfile(Player player) {
        //this.player = player;
    }

    public PlayerProfile(String name, String uuid) {
        this.name = name;
        this.UUID = uuid;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUUID() {
        return this.UUID;
    }

    public void setUUID(String uuid) {
        this.UUID = uuid;
    }

    @Transient
    public boolean isLoaded() {
        return true;
    }

    public void setLoaded(boolean loaded) {
        this.loaded = loaded;
    }
}

16: 28: 01 [ОШИБКА] [FDevTools] java.lang.ClassNotFoundException: jasin.mcmmo.datatypes.player.PlayerProfileBeanInfo

16: 28: 01 [ОШИБКА] [FDevTools] java.lang.ClassNotFoundException: jasin.mcmmo.datatypes.player.PlayerProfileCustomizer

Ожидаемый результат: эти классы являются этими классамии PlayerProfileCustomizer не следует загружать, так как они не существуют. Или не должно существовать на афаике. Есть ли что-то, чего мне не хватает, как работает snakeyaml, и для этого нужны эти классы? Я уверен, что мне здесь не хватает нюанса, но я не могу его найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...