Загрузка класса в качестве компонента в Java - PullRequest
2 голосов
/ 02 января 2011

Я создаю программу, которая позволяет вам добавить любой файл класса, который расширяет java.awt.Component до javax.swing.JToolBar в его главном окне. Я создал тестовый класс, который представляет собой просто пустой javax.swing.JButton с именем «test.class». Как я могу загрузить это в программу как компонент в моем javax.swing.JToolBar, когда все, что я знаю, это где на компьютере хранится этот файл класса?

В качестве альтернативы: учитывая, что конечный проект представляет собой один файл JAR (TinyExplorer.jar) и что он находится, скажем, в C: \ Users \ Username \ Desktop \ TinyExplorer.jar, где должен быть размещен класс надстройки и как баночка должна это искать?

Редактировать


Я реализовал следующий код:

      if (addOnFile.exists())
      {
        System.out.println(addOnFile.getName() + " is there!");
        java.util.Scanner scan = new java.util.Scanner(addOnFile);
        while (scan.hasNextLine())
        {
          String str = scan.nextLine();
          System.out.println(str);
          java.io.File f = new java.io.File(str);
          if (f.exists())
          {
            try
            {
              java.awt.Component comp;
              Class cls = Class.forName(str);
              Object obj = cls.newInstance();

              if (obj instanceof java.awt.Component)
              {
                comp = (java.awt.Component)obj;
              }
            }
            catch (Exception err)
            {
              err.printStackTrace();
            }
          }
        }
      }

но каждый раз, когда я запускаю его, я получаю следующее исключение:

java.lang.ClassNotFoundException: G:\Java\NetBeansProjects\TinyExplorer\build\classes\testAddOn\test.class
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at explorer.Frame$24.run(Frame.java:1091)

Ответы [ 3 ]

1 голос
/ 02 января 2011

Звучит так, будто вы хотите что-то вроде этого:

Component comp = null;
String cls_name = "test";  // include your package ie "java.lang.String"

try {
    Class cls = Class.forName(cls_name);
    Object obj = cls.newInstance();

    if (obj instanceof Component) {
        comp = (Component) obj;
    }
}
catch (Exception err) {
    err.printStackTrace();
}

setLayout(new BorderLayout() );

JToolBar toolbar = new JToolBar();
if (comp != null) {
    toolbar.add(comp);
}

add(toolbar, BorderLayout.NORTH);

Class.forName() и Class.newInstance() создают экземпляр вашего нового объекта. Блок try имеет большой потенциал для исключений, и вы можете захотеть сделать его лучше, чем универсальный. Если в вашем классе нет конструктора по умолчанию, это не сработает, и вам нужно получить объект Constructor с помощью отражения и создать объект, вызвав Constructor.newInstance(...).

1 голос
/ 02 января 2011

выпуск

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

java.lang.ClassNotFoundException: G:\Java\NetBeansProjects\TinyExplorer\build\classes\testAddOn\test.class

Это означает, что код пытается найти имя класса, которое на самом деле является путем к файлу class. Это неправильное использование метода Class.forName.

Имя 1015 *, которое принимает метод Class.forName ( ссылка на Java API Спецификация метода ), представляет собой полное имя класса из класс, который должен быть загружен. Например, если мы хотим загрузить класс JPanel, нам потребуется предоставить "javax.swing.JPanel", , а не полный путь к файлу class.

Решение

Из этого кода видно, что предполагается, что класс, содержащийся в файле class с полным путем к файловой системе G:\Java\NetBeansProjects\TinyExplorer\build\classes\testAddOn\test.class, должен быть загружен во время выполнения.

Для этого нужно

  1. Включить файл class в classpath .
  2. Присвойте полное имя класса классу Class.forName, чтобы получить объект Class<?>.
  3. Создание объекта Class<?> с использованием отражения .

Выполнение (1) будет требоваться для виртуальной машины Java, чтобы иметь возможность найти класс, который должен быть загружен в (2) - файл class, который не находится в classpath, не собирается быть доступным во время выполнения.

Включение файла в classpath обычно представляет собой конфигурацию компоновки в вашей среде IDE или необходимость указать javac для добавления пути к classpath .

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

0 голосов
/ 02 января 2011

В учебнике http://download.oracle.com/javase/tutorial/uiswing/components/toolbar.html приведены примеры добавления кнопок. Предложите, чтобы это было запущено и работало в вашей среде. Затем вы можете расширить его по аналогии с вашими собственными компонентами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...