gpt4 book ai didi

java - Class.getDeclaredMethods 对于没有参数和 void 返回类型的类方法抛出 NoClassDefFoundError

转载 作者:行者123 更新时间:2023-12-02 00:29:32 24 4
gpt4 key购买 nike

我想获取依赖于其他 class2 的 class1 的所有公共(public)方法的名称(void 返回类型且无参数)。我正在通过 UrlClassLoader 加载类。现在,当我调用 getDeclaredMethods 时,它会抛出由 ClassNotFoundException 引起的 NoClassDefFoundError 。

我有 3 个 mvn 模块

  1. SampleClassLoader:用于获取Module1类的方法。
  2. Module1:它的类使用对 Module2 的类的引用。并且在其 pom.xml 中也有 Module2 的依赖项。
  3. 模块2

整个模块结构如下: Project Structure

ClassLoadingTest
|----- Module1
| |--- pom.xml
| |--- src/main/java/
| | |--- com.classloadingtest.module1
| | |
| | |--- Module1Class1.java
| | |--- Module1Class2.java
|
|----- Module2
| |--- pom.xml
| |--- src/main/java/
| | |--- com.classloadingtest.module2
| | |
| | |--- Module2Class.java
|
|----- SampleClassLoader
| |--- pom.xml
| |--- src/main/java/
| | |--- com.classloadingtest.sampleClassLoader
| | |
| | |--- SampleClassLoader.java

Module1Class1.java

public class Module1Class1 {
public void claas1Fun() {
Module2Class module2ClassObj = new Module2Class();
module2ClassObj.module2Fun();
}
}

Module1Class2.java

public class Module1Class2 {

public void class2Fun(){
try {
Module2Class module2ClassObj = new Module2Class();
module2ClassObj.module2Fun();
} catch(Exception e ){

}
}
}

Module2Class.java

public class Module2Class {

public void module2Fun(){

}
}

SampleClassLoader.java

public class SampleClassLoader {
public static void main(String[] args) {

try {

URL mainSourceClassPathURL = new URL("file:" + System.getProperty("user.dir") + "/ClassLoadingTest/Module1/target/classes/");

URL[] urls = { mainSourceClassPathURL};
ClassLoader classLoader = URLClassLoader.newInstance(urls);

Class<?> testCaseClass = classLoader.loadClass("com.classloadingtest.module1.Module1Class1");
Method method[] = testCaseClass.getDeclaredMethods();

for (int i = 0 ; i < method.length ; i++) {
System.out.println(method[i].getName());
}

} catch (Exception e){
e.printStackTrace();
}

}
}

现在,运行类 Module1Class1 的 SampleClassLoader 时会打印

claas1Fun

但是当运行类 Module1Class2 时,它给出的 NoClassDefFoundError 为:

Exception in thread "main" java.lang.NoClassDefFoundError: com/classloadingtest/module2/Module2Class
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at com.classloadingtest.sampleClassLoader.SampleClassLoader.main(SampleClassLoader.java:26)
Caused by: java.lang.ClassNotFoundException: com.classloadingtest.module2.Module2Class
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:814)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 4 more

我有两个问题:

  1. 使用try catch时,为什么会报错?
  2. 如果 class1 已经在 classLoader.loadClass 处加载,那么为什么 getDeclaredMethods 方法需要加载依赖类?

最佳答案

关于try-catch问题,重点是java.lang.NoClassDefFoundError不是一个Exception,而是一个Error,它是一种更严重的Throwable

一般来说,错误是不可恢复的(例如 OutOfMemoryError 或 StackOverflowError,...),因此很少会被捕获。

如果你想捕获 NoClassDefFoundError 你应该添加 catch(NoClassDefFoundError e) 到你的 try

关于java - Class.getDeclaredMethods 对于没有参数和 void 返回类型的类方法抛出 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58026750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com