2016-05-18 7 views
2

Я поместил файл .jar, содержащий файл .dex, в каталог «/ sdcard», затем я попытаюсь загрузить класс в файле .jar, используя DexClassLoader и PathClassLoader соответственно. Оба они могут загрузить класс успешно. Каковы различия между ними? Вот мой код:Каковы различия между DexClassLoader и PathClassLoader?

String dexPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.jar"; 
PathClassLoader classLoader1 = new PathClassLoader(dexPath, getClassLoader()); 
DexClassLoader classLoader2 = new DexClassLoader(dexPath, getDir("dex", 0).getAbsolutePath(), null, getClassLoader()); 
try { 
    Class clazz1 = classLoader1.loadClass("com.focans.loader.Peter"); 
    Class clazz2 = classLoader2.loadClass("com.focans.loader.Peter"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

ответ

2

Вы должны прочитать официальный Рекомендацию о

DexClassLoader

Класс загрузчика, который загружает классы из .jar и .apk файлов, содержащих в classes.dex. Это можно использовать для выполнения кода, не установленного как часть приложения .

PathClassLoader

Обеспечивает простую реализацию ClassLoader, которая работает в списке файлов и каталогов в локальной файловой системе, но не попытку загрузки классов из сети. Android использует этот класс для своего загрузчика системного класса и для своего загрузчика (ов) класса приложения.

DexClassLoader экземпляра, чтобы загрузить библиотеку из извлеченного вторичного DEX файла.

PathClassLoader Используется для загрузки классов внутри муравья с другим путём классов, который использовался для запуска муравья. Обратите внимание, что можно включить класс в этот загрузчик, даже если этот класс находится в системном пути класса, используя метод forceLoadClass. Любые последующие классы, загруженные этим классом, будут использовать этот загрузчик, а не загрузчик системного класса.

+0

Что вы подразумеваете под 'ant'? Также в PathClassLoader не существует никакого метода 'forceLoadClass'. – Codebender

Смежные вопросы