2015-07-22 1 views
0

Я пишу приложение java, которое выполняет некоторую операцию в текстовом файле. Я добавлю возможность в свое приложение, которое может использовать работу пользователей и управлять ими в файле. Я заставил их реализовать свой интерфейс, чтобы держать имена своих методов в моей руке. И заставил их поместить свои файлы классов в определенный путь, чтобы загрузить их в моем приложении, но я не имею никакой идеи, чтобы их имена пакетов классов пользователя загружали с помощью метода class.forName(packageName.ClassName).Есть ли способ загрузить все классы по определенному пути, не зная имена их пакетов?

Есть ли способ загрузить все классы по определенному пути, не зная их имена пакетов?

ответ

0

Вы можете попросить пользователей добавить текстовый файл, в котором перечислены все их имена классов на верхнем уровне их пути к классу. Затем вы можете использовать ClassLoader.getSystemResource, чтобы получить эти файлы и получить имена классов.

0

Nope. Метод Java ClassLoader.loadClass (String) требует, чтобы имена классов были полностью определены их именем пакета и класса (bb «двоичное имя» в Спецификации языка Java).

Можно загружать и перезагружать классы во время выполнения на Java с использованием Java Reflection. Отражение обычно используется программами, которые требуют возможности исследовать или изменять поведение среды выполнения приложений, запущенных на виртуальной машине Java.

Загрузка динамической загрузки Java является важной особенностью виртуальной машины Java, поскольку она обеспечивает платформу Java возможность устанавливать программные компоненты во время выполнения.

Загрузка класса динамически проста. Все, что вам нужно сделать, это получить ClassLoader и вызвать его метод loadClass(). Вот пример:

public class MainClass { 

    public static void main(String[] args){ 

    ClassLoader classLoader = MainClass.class.getClassLoader(); 

    try { 
     Class aClass = classLoader.loadClass("com.jenkov.MyClass"); 
     System.out.println("aClass.getName() = " + aClass.getName()); 
    } catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
    } 
} 
+0

Да, вы сказали правильно, но моя проблема заключается в том, чтобы найти «com.jenkov» перед загрузкой класса. –

+0

следующий метод - загрузить все классы из файла jar. –

2

Имена классов извлекаются из JarEntry.

JarFile jarFile = new JarFile(JarPath); 
Enumeration e = jarFile.entries(); 

URL[] urls = { new URL("jar:file:" + pathToJar+"!/") }; 
URLClassLoader cl = URLClassLoader.newInstance(urls); 

while (e.hasMoreElements()) { 
    JarEntry je = (JarEntry) e.nextElement(); 
    if(je.isDirectory() || !je.getName().endsWith(".class")){ 
     continue; 
    } 
// -6 because of .class 
String className = je.getName().substring(0,je.getName().length()-6); 
className = className.replace('/', '.'); 
Class c = cl.loadClass(className); 
}