2010-05-25 2 views
0

Мне нужно сканировать класс или файл jar, который реализует или расширяет определенный класс.
Это тот же механизм, что и Eclipse для сканирования присутствия плагина. Есть ли способ сделать это?Сканировать класс или файл jar в Java

+0

есть способы, но вам это не нужно;) – Bozho

+1

@Bozho: Почему бы и нет? Не говорите мне, что вы чувствуете его запах;). –

ответ

1

От exmaple depot: How to load a Class that is not on the classpath:

// Create a File object on the root of the directory 
// containing the class file 
File file = new File("c:\\class\\"); 

try { 
    // Convert File to a URL 
    URL url = file.toURL();   // file:/c:/class/ 
    URL[] urls = new URL[]{url}; 

    // Create a new class loader with the directory 
    ClassLoader loader = new URLClassLoader(urls); 

    // Load in the class; Class.childclass should be located in 
    // the directory file:/c:/class/user/information 
    Class cls = loader.loadClass("user.informatin.Class"); 
} catch (MalformedURLException e) { 
} catch (ClassNotFoundException e) { 
} 

Список файлов в каталоге, при необходимости, используя File.list().

Когда класс загружен, вы можете проверить, реализует ли он конкретный интерфейс, выполнив clazz.isInstance. Из документов:

Определяет, совместим ли указанный объект с объектом, представленным этим классом. Этот метод является динамическим эквивалентом оператора экземпляра языка Java.


Для загрузки классов из JAR-файла:

How to load a jar file at runtime

Чтобы получить список файлов в файле фляги: JarFile.entries().

+0

Если бы я загрузил его из банки? – enfix

+0

обновленный ответ. – aioobe

0

Да, есть способы только для этого. Посмотрите на документы here.

Более конкретные ссылки,

+0

Как я могу загрузить этот конкретный класс? Я сканирую его, но тогда мне также нужно загрузить это, только если он реализует определенный интерфейс. – enfix

+0

@enfix: сначала вы загружаете его, затем сканируете его, если он соответствует вашему требованию, используйте его, иначе бросьте его. –

0

Вы можете сканировать его без загрузки класса с помощью парсера байт-кода, такого как ASM или BCEL. С ASM ...

byte[] bytecode = [read bytes from class or jar file]; 
ClassReader reader = new ClassReader(bytecode); 
String[] interfaces = reader.getInterfaces(); 
Смежные вопросы