当前位置: 首页 > 知识库问答 >
问题:

执行Java时发现异常

南门茂才
2023-03-14

我编写了一个简单的注释和一个AnnotationProcessor来处理注释。

注释只有一个值:它应该是现有接口(带有包)的名称。

注释处理器应该检索注释的值,检索接口的类对象,最后应该打印接口中声明的所有方法。

例:这是我的注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation{
    public String interfaceName();
}

这是带注释的类:

@MyAnnotation(interfaceName = "java.lang.CharSequence")
public class Example{}

我的处理器看起来像

[...]
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {

    for (TypeElement te : annotations) {

        for(Element e : env.getElementsAnnotatedWith(te)) {

            MyAnnotation myAnnotation = e.getAnnotation(MyAnnotation.class);
            String iName = myAnnotation.interfaceName();
            Class<?> clazz = Class.forName(iName);
            // use reflection to cycle through methods and prints them
            [...]
        }
    }

现在,如果我配置一个像java.lang.CharSequence这样的接口作为MyAnnoation的接口名称,这个工作原理很好;

但是,如果我将位于中的接口配置为interfaceName。jar文件(添加到项目的构建路径中),当我尝试执行该类时,会获得一个ClassNotFoundException。forName(…)陈述

有什么想法吗?

谢谢,干杯

共有1个答案

瞿兴朝
2023-03-14

这是一个典型的类加载器问题。您试图查找当前类加载器未加载的类,因此会引发ClassNotFoundException

java的Javadoc。lang.Class定义方法类。forName(className)作为:

返回与给定字符串名称的类或接口关联的Class对象。调用此方法等效于Class.forName(class Name, true,电流加载器),其中电流加载器表示当前类的定义类加载器。

因此,这个方法调用将尝试在当前类加载器上下文中查找指定的类。您试图找到的接口没有被这个类加载器加载,因此会抛出一个ClassNotFoundExc0019

如果. jar文件位于应用程序的类路径上,您可以简单地使用系统类加载器,就像这样...

ClassLoader systemClassLoader = ClassLoader.getSystemClassloader();
Class<?> clazz = Class.forName(className, true, systemClassLoader)

...但是如果你的。jar文件位于其他位置,尚未加载,您需要相应地加载它:

ClassLoader urlClassLoader = new URLClassLoader(new URL[]{new URL("path/to/file.jar")});
Class<?> clazz = Class.forName(className, true, urlClassLoader)

等等,瞧!

 类似资料:
  • ,而项目本身可以完美地运行eclipse IDE。 我尝试了相同问题的解决方案,但错误仍然存在。这是一个maven项目,pom.xml具有所有依赖项。 有人能帮我解决这个问题,或者建议一种通过eclipse IDE执行java-callgraph的方法来达到同样的目的吗?

  • 问题内容: 我正在尝试引发异常(不使用try catch块),并且程序在引发异常后立即完成。有没有一种方法可以在我引发异常之后继续执行程序?我抛出了在另一个类中定义的InvalidEmployeeTypeException,但是我希望程序在抛出该异常后继续执行。 问题答案: 试试这个:

  • 我是新手Java8,在下面的示例中,我创建了一个Map,其中keyvalue为String,value为ArrayList的整数。 我编写了以下代码来针对每个键执行数组列表元素的总和,并尝试将总和值存储在单独的 ArrayList 中。 当我尝试执行以下代码时,我收到以下异常。 线程“main”中出现异常Java . lang . unsupportedoperationexception Jav

  • 我安装了Maven 3.2.5并在我的项目目录中执行了。显示以下错误: 插件org.apache.maven.plugins:maven-resources-plugin:2.6或其依赖项无法解析:无法读取org.apache.maven的工件描述符。plugins:maven-resources-plugin:jar:2.6:无法将工件org.apache.maven.plugins:maven

  • 在Eclipse中运行JUnit测试时,我会收到以下错误: 虽然我使用的是maven,但我尝试在类路径中添加库,并且JUnit库位于POM依赖项中。 我已经尝试过清理该项目,并使用Eclipse的JUnit插件创建了一个新的JUnit测试用例,但仍然得到相同的错误。

  • 运行lambda函数时,我得到一个Boto3无效参数异常。我正试图找到一种方法来处理这个异常。 我遇到了以下解决方案: 我使用的是python3,我知道boto现在已被弃用,并被boto3取代。但我在boto3中找不到等效的解决方案。 有人能帮我解决这个问题吗?