Исключение загрузки класса в java отражении - PullRequest
0 голосов
/ 13 июля 2011

Я выбрал файл jar, используя селектор файлов, а затем загрузил все классы в файле jar, используя отражение java.Некоторые классы зависят от другого jar-файла.

Но когда я пытаюсь получить метод класса, выдается следующее исключение, потому что у этого класса есть оператор импорта import com.thoughtworks.xstream.XStream;, а класс XStream определен в другом jar-файле.

Exception in thread "main" java.lang.NoClassDefFoundError: com/thoughtworks/xstream/io/HierarchicalStreamDriver
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2365)
    at java.lang.Class.privateGetPublicMethods(Class.java:2488)
    at java.lang.Class.getMethods(Class.java:1406)
    at com.axway.xtp.testgenerator.templatewizard.MethodSelectionWizardUI.updateListofMethods(MethodSelectionWizardUI.java:744)
    at com.axway.xtp.testgenerator.templatewizard.MethodSelectionWizardUI$7.widgetSelected(MethodSelectionWizardUI.java:474)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:90)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)

Я хотел знать, есть ли способ предотвратить загрузку класса зависимостей или файла JAR с использованием java-отражения.Ниже приведен фрагмент кода, который я использую для загрузки классов.

URLClassLoader ucl = new URLClassLoader(new URL[] { new URL("file:" + codeRepository) });
JarFile jarFile = new JarFile(new File(codeRepository));
Enumeration enm = jarFile.entries();
while (enm.hasMoreElements()) {
  JarEntry entry = ((JarEntry) enm.nextElement());

  if (entry.getName().endsWith(".class")) {
    String fullClassNameWithPath = entry.getName();
    String fullyClassifiedClassName = fullClassNameWithPath
        .replace('/', '.');

    try {
      Class c = ucl.loadClass(fullyClassifiedClassName.substring(
          0, fullyClassifiedClassName.indexOf(".class")));
      String className = c.getPackage().getName() + "."
          + c.getSimpleName();
      listClasses.add(className);
    } catch (Exception e) {
      continue;
    } catch (Throwable t) {
      continue;
    }
  }
}

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Что ж, если ваше приложение зависит от этого класса, вам наиболее определенно необходимо иметь jar, содержащий его (или предоставить альтернативный путь, содержащий package + class) на пути к классам.

0 голосов
/ 13 июля 2011

Как часть процесса загрузки классов, все классы, от которых зависит класс, который вы хотите загрузить, также будут загружены.

Не думаю, что с этим можно что-то сделать.

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