@all23081992

Можно ли переопределить метод в библиотеке?

Здравствуйте.
Разрабатываю проект в android studio. В проекте подключена библиотека в которой требуется изменить класс class1. Можно ли как то переопределить библиотечный класс class1 в overclass1 , так что бы изменений в первоначальном классе class1 не было, но классы библиотеки использовали мой переопределенный класс overclass1?
  • Вопрос задан
  • 1335 просмотров
Пригласить эксперта
Ответы на вопрос 2
Создайте свой класс отнаследовав от библиотечного.
Переопределите нужные методы.
Используйте созданный класс.
PS при условии что класс не final и нужный метод не final.
Ответ написан
angry_cellophane
@angry_cellophane
1. Погуглить порядок загрузки библиотек. Возможно, есть шанс переопределить класс библиотеки своим.
2. Использовать рефлексию
public class Main {

    static {
        try {
            Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
            unsafeField.setAccessible(true);
            Unsafe U = (Unsafe) unsafeField.get(null);

            File f = new File("C:\\dev\\tmp\\TestA.class");
            FileInputStream input = new FileInputStream(f);
            byte[] content = new byte[(int)f.length()];
            input.read(content);
            input.close();

            U.defineClass("com.company.a.TestA", content, 0, content.length, Main.class.getClassLoader(), Main.class.getProtectionDomain());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        ClassLoader loader = Main.class.getClassLoader();
        System.out.println(loader.getParent());
        System.out.println(new TestA());
    }
}


Unsafe - штука специфичная, defineClass под андроидом может и не быть. В этому случае можно получить текущий класслоадер, заменить в нем родительский лоадер на свой. Свой лоадер вызывает приватный метод URLClassLoader#defineClass, который делает тоже самое, что и код выше.

Вообще, изврат какой-то. Не стоит это того.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы