2010-05-07 2 views
2

Я пытаюсь создать программу, которая может загрузить неизвестный набор плагинов из подпапки «Плагины». Все эти плагины реализуют один и тот же интерфейс. Мне нужно знать, как мне найти все классы в этой папке, чтобы я мог создавать и использовать их?Как получить доступ к классам Java в подпапке

ответ

2

MyInterface.java

Заглушка интерфейс.

package test; 
public interface MyInterface { 
    public void printSomething(); 
} 

TestClass.java

тест класс должен быть загружен, реализуя свой интерфейс.

import test.MyInterface; 
public class TestClass implements MyInterface { 
    public void printSomething() { 
     System.out.println("Hello World, from TestClass"); 
    } 
} 

(Составитель класс файл, помещенный в "подпапке /".)


Test.java

Полная тестовая программа, которая загружает все файлы класса "подпапку /" и создает экземпляр и запускает на нем метод интерфейса.

package test; 
import java.io.File; 

public class Test { 
    public static void main(String[] args) { 

     try { 
      ClassLoader cl = ClassLoader.getSystemClassLoader(); 
      File subfolder = new File("subfolder"); 

      for (File f : subfolder.listFiles()) { 
       String s = f.getName(); 
       System.out.println("Loading " + s); 
       Class cls = cl.loadClass(s.substring(0, s.lastIndexOf('.'))); 

       MyInterface o = (MyInterface) cls.newInstance(); 
       o.printSomething(); 
      } 
     } catch (ClassNotFoundException e) { 
     } catch (InstantiationException e) { 
     } catch (IllegalAccessException e) { 
     } 
    } 
} 

Выход из программы испытаний выше:

Загрузка TestClass.class
Hello World, от TestClass

+0

Этот раствор зависит от упаковки? –

+0

Что это значит? Нет, не совсем... – aioobe

0

Просмотрите папку с File.listFiles() и используйте экземпляр JarClassLoader для загрузки классов там.

Или добавьте description.xml в каждую из этих банок, если они находятся в пути к классам, и используйте getClass(). GetClassLoader(). FindResources ("description.xml"), чтобы загрузить все описания, а затем у вас есть все классы плагинов для загрузки.

1

Проверить java.util.ServiceLoader

Служба представляет собой хорошо известный набор интерфейсов и (обычно) абстрактных классов. Поставщик услуг - это конкретная реализация службы. Классы в провайдере обычно реализуют интерфейсы и подклассы классов, определенных в самой службе. Поставщики услуг могут быть установлены в реализации платформы Java в виде расширений, то есть файлов jar, помещенных в любой из обычных каталогов расширений. Поставщики также могут быть доступны, добавив их в путь к классу приложения или с помощью некоторых других средств для платформы.

This article объясняет детали.

0

аннотировать классы реализации с аннотациями и использование scannotation это байтовый код сканирования c lass files, и является порядком величин быстрее, чем что-либо еще, вы можете использовать его для мгновенного поиска всего очень большого класса.

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