ASM

Версия Minecraft
1.7.10
API
Forge
236
4
22
Добрый день всем. Хотел бы задать сейчас вопрос тем, кто шарит в ASM хуках. Возможно ли при загрузке моего кор-мода собрать все классы из модов реализующие определённый интерфейс? Если да - можно примерчик, пожалуйста))
Pss: Интерфейс который реализуют искомые классы не из моего мода.
 
Решение
Классы загружаются не все сразу, а по мере необходимости.
Java:
private boolean isChildOfClass(ClassNode classNode, String className){
        List<String> list = Lists.newArrayList();
        list.add(classNode.name);
        printSuperClassNames(classNode.name, list);
        for(String s : list){
            if(className.equals(s)){
                return true;
            }
        }

        return false;
    }

    private void printSuperClassNames(String className, List<String> list){
        if(className == null){
            return;
        }

        ClassReader classReader;
        try{
            classReader = new ClassReader(className);
        }catch(Throwable ignored){
            return;
        }

        String superName...

tox1cozZ

aka Agravaine
8,455
598
2,892
Классы загружаются не все сразу, а по мере необходимости.
Java:
private boolean isChildOfClass(ClassNode classNode, String className){
        List<String> list = Lists.newArrayList();
        list.add(classNode.name);
        printSuperClassNames(classNode.name, list);
        for(String s : list){
            if(className.equals(s)){
                return true;
            }
        }

        return false;
    }

    private void printSuperClassNames(String className, List<String> list){
        if(className == null){
            return;
        }

        ClassReader classReader;
        try{
            classReader = new ClassReader(className);
        }catch(Throwable ignored){
            return;
        }

        String superName = classReader.getSuperName();

        if(superName != null && !superName.equals("java/lang/Object")){
            list.add(superName);
            String superClass = superName.replace('.', '/');
            printSuperClassNames(superClass, list);
        }

        if(classReader.getInterfaces() != null && classReader.getInterfaces().length > 0){
            for(String itf : classReader.getInterfaces()){
                list.add(itf);
                String interfaceName = itf.replace('.', '/');
                printSuperClassNames(interfaceName, list);
            }
        }
    }
Проверяем, расширяет ли текущий класс интерфейс IInventory:
if(isChildOfClass(classNode, isObfuscated ? "rb" : "net/minecraft/inventory/IInventory"))
 
236
4
22
Классы загружаются не все сразу, а по мере необходимости.
Так. Как проверить реализован ли интерфейс впринципе понятно. Но вопрос в другом тогда, а как мне перехватить тогда загрузку класса и подменить в нём код трансформером? Нужен ли мне вообще кор-мод в данном случае?

Также попутно вопрос: Какой правильный нужно выбрать импорт класса ClassReader (у меня их в IDEA вроде аж 3)
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Но вопрос в другом тогда, а как мне перехватить тогда загрузку класса и подменить в нём код трансформером?
Ты классноду передаешь в метод, это и есть текущий класс.

Также попутно вопрос: Какой правильный нужно выбрать импорт класса ClassReader (у меня их в IDEA вроде аж 3)
Который из asm, какой же ещё.
 
Сверху