java - java反射中的类加载异常

标签 java reflection

我使用文件选择器选择了一个 jar 文件,然后使用 java 反射加载了 jar 文件中的所有类。有些类依赖于另一个 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)

我想知道有什么方法可以阻止使用java反射加载依赖类或jar文件。以下是我用来加载类的代码段。

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;
    }
  }
}

最佳答案

好吧,如果您的应用程序依赖于该类,那么您绝对需要包含它的jar(或提供包含包+类的替代路径)类路径。

关于java - java反射中的类加载异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6679864/

相关文章:

java - Bean 属性访问和注解

c# - 获取引用类型的全名而不加载其程序集

java - 通过反射改变 colorPrimary 和 colorAccent

java - 在具有相同 CN 名称但别名不同的信任库中导入多个 CA

java - 如何从主窗口打开新窗口?

java - 如何使用 SimpleDateformat 格式化公历日期

java - Spring Boot库和应用程序结构

java - 如何创建动态拖放模板?

c# - 使用反射传递参数时,Visual Studio 转换是多余的

c# - 使用 Dynamic 而不是反射来按名称调用方法