Хорошо, поэтому я в настоящее время сканирую папку/Scripts/для папок и проверяю эти папки для .classИзмените упаковку с "/" на "."
Проблема в том, когда я загружаю классы в classloader, я получаю сообщение об ошибке с упаковкой. Он не заменяет «/» на «.». как и следовало бы.
Мой код:
@SuppressWarnings({"rawtypes", "unchecked"})
public Class[] getClassesFromFolder() {
File folder = getFolder();
String thePath = folder.getPath();
ArrayList<String> folders = new ArrayList<String>();
ArrayList<String> classesName = new ArrayList<String>();
try {
Files.walk(Paths.get(thePath + "\\Scripts\\")).forEach(filePath -> {
if (Files.isDirectory(filePath)) {
folders.add(filePath.toString());
}
if (Files.isRegularFile(filePath)) {
classesName.add(filePath.getFileName().toString());
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ArrayList<Class<Script>> classes = new ArrayList<Class<Script>>();
try {
for(int i = 0; i < folders.size(); i++) {
File scriptFolder = new File(folders.get(i).replaceAll("/", "\\\\"));
System.out.println(scriptFolder.toString());
URLClassLoader cl = new URLClassLoader(new URL[] {
new File(scriptFolder.toString())
.toURI().toURL() });
for(int y = 0; y < classesName.size(); y++) {
String script = classesName.get(y);
if (script.contains(".class") && !script.contains("$")) {
String truePath = script.replace(".class", "");
try {
Class<?> scriptClass = (Class<?>) cl
.loadClass(truePath);
classes.add((Class<Script>) scriptClass);
} catch (Exception e) {
e.printStackTrace();
}
}
}
cl.close();
}
} catch (Exception e) {
e.printStackTrace();
}
Ошибка:
C:\Users\Ethan\Client\Scripts\com\ethan\test\main
Exception in thread "Thread-7" java.lang.NoClassDefFoundError: Core (wrong name: com/ethan/test/main/Core)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.client.api.script.ScriptManager.getClassesFromFolder(ScriptManager.java:103)
at com.client.ui.components.ScriptSelector.getData(ScriptSelector.java:57)
at com.client.ui.components.ScriptSelector.<init>(ScriptSelector.java:42)
at com.client.ui.components.sidebar.panels.RunPanel$1.run(RunPanel.java:59)
Вы находитесь в неправильной папке, переходите от 'C: \ Users \ Ethan \ Client \ Scripts \ com \ ethan \ test \ main' к' C: \ Users \ Ethan \ Client \ Scripts'. –