Импортировать класс в Java по абсолютному пути - PullRequest
0 голосов
/ 29 мая 2018

Я пытался импортировать .class по абсолютному пути во время выполнения кода, и я не знаю, как это сделать.

Я нашел способ импортировать класс, когда он уже находится в проектепуть сборки Class.forName();, но мне нужно найти способ загрузить класс, который не находится в пути сборки.

Цель:

  1. Пользователь может загрузить свой собственный.class файл, который затем сохраняется локально в определенной папке, а путь сохраняется в базе данных
  2. . Через GUI пользователь может выбрать этот файл для использования во время выполнения кода
  3. Мой код должен загрузить классчерез этот заданный абсолютный путь во время выполнения кода

Проблема в 3-м пункте, потому что я не знаю, возможно ли загрузить класс во время выполнения кода.

IЯ пытался использовать URLClassLoader, но я получаю сообщение об ошибке ClassNotFound.

РЕДАКТИРОВАТЬ:

В основном, у меня есть эта статическая функция, которая должна возвращать Class по его имени,но urlClassLoader.loadClass () выдает ошибку.

Имяфайл - это J48.class, поэтому для аргумента className я попытался использовать «J48», «J48.class», но ни один из них не работает.

Дополнительно я попытался установить классификаторы папок для построения пути и задать аргумент "weka.classifiers.trees.J48", который является полным путем с пакетом к этому классу (структура пакета - weka.classifiers.trees).

`public static Class getClassByName(String className) throws MalformedURLException, ClassNotFoundException 
    {
        URLClassLoader urlClassLoader = URLClassLoader.newInstance(new URL[] {
                   new URL("file:///D:\\xampp\\htdocs\\prog-ing\\classifiers\\")
        });

        Class class = urlClassLoader.loadClass(className);

        return class;
    }`

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Хорошо, подумав немного, я нашел только одно решение (которое все еще не удовлетворено им), а именно:

каждый класс, который должен быть загружен пользователем, сохраняется в рабочей области этого проекта.и, следовательно, я могу получить класс, используя Class.forName();, указывая на эту «папку» загруженных классов, в моем случае: Class.forName("classifiers.className");

0 голосов
/ 29 мая 2018

Мне кажется, у меня есть предложение решить вашу проблему ...

Я знаю два варианта:

  • Вариант 1 : чтение файла класса изdirectory.

Пример:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Test5 extends ClassLoader {

    private static final String PATH = "C://myFiles//";

    public static void main(String[] args) {
        Class clazz = getClassFromName("Test4");
        System.out.println(clazz);
    }

    private static Class getClassFromName(String className) {
        File file = new File(PATH + className + ".class");

        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            byte[] bytes = new byte[fileInputStream.available()];

            fileInputStream.read(bytes);

            return defineClass(className, bytes, 0, bytes.length);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

}

Это напечатает что-то вроде этого:

класс Test4

- Опция 2 : чтение файла класса из JAR.

Пример:

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class Test5 {

    private static final String PATH = "C://myFiles//";

    public static void main(String[] args) {
        Class clazz = getClassFromFile("myJar.jar", "com.mypackage.Test4");
        System.out.println(clazz);
    }

    private static Class getClassFromFile(String fromFile, String className) {
        try {
            URL url = new URL("file:////" + PATH + fromFile);
            URLClassLoader urlClassLoader = URLClassLoader.newInstance(
                new URL[] {
                    url
            });

            return urlClassLoader.loadClass(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        return null;
    }

}

Будет напечатано что-то вроде этого:

class com.mypackage.Test4

Обратите внимание, что для чтения файла jar мне пришлось указать полный путь пакета к файлу класса.

НадеюсьЯ помог.

...