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, который делает тоже самое, что и код выше.
Вообще, изврат какой-то. Не стоит это того.