Как загрузить классы вне программы? - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь сделать загрузчик классов / загрузчик модов для моей программы.Пока у меня есть этот загрузчик:

    // methodTB - swing text field for method
    // classTB - swing text field for class
    // classCB - swing check box for default class (which is the file name)

    // Grab the URL of the file
    URL url = file.toURI().toURL();
    URL[] urls = new URL[]{url};
    // Make a ClassLoader
    ClassLoader cl = new URLClassLoader(urls);
    // If the class name = file name
    if (classCB.isSelected()) {
        // Get the name of the class
        className = file.getName();
        // Remove the file extension
        className = className.substring(0, className.lastIndexOf('.'));
    }
    // Else
    else {
        // Grab directly from the TB
        className = classTB.getText();
    }
    // Load it
    Class cls = cl.loadClass(className);
    Method method = cls.getDeclaredMethod(methodTB.getText());
    Object instance = cls.newInstance();
    Object result = method.invoke(instance);

Это работает для классов, которые уже существуют в программе, однако при попытке загрузить другие классы появляется следующее исключение:

java.lang.ClassNotFoundException: example
   at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
   at modloader.lambda$menu$1(modloader.java:116) <4 internal calls>
   at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) <31 internal calls>

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

(для контекста вот полный код )

1 Ответ

0 голосов
/ 06 июня 2019

Если мое понимание верно, вы хотите загрузить класс, который находится за пределами classpath.Вы должны написать так.

URL jarFilesUrl = new URL("file:/" + "dir containing jar files" + "/"); 
URLClassLoader cl = new URLClassLoader(new URL[] {jarFilesUrl},getClass().class.getClassLoader());
CustomClass customObj = (CustomClass) cl.loadClass("com.pkg.CustomClass").newInstance();

В этом случае должен существовать каталог, который может содержать некоторые файлы JAR.

...