为什么在使用 Class.forName(...) 时会出现 ClassNotFoundException?

2024-04-14

在下面的示例中,我尝试使用sun.tools.javac.Main动态编译我生成的类,然后实例化该类的对象并调用方法。到目前为止,我什至无法通过加载生成的类。我在 Eclipse 中遇到以下异常:

java.lang.ClassNotFoundException: TestHello_1289950330167
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at MyClassGenerator.runIt(MyClassGenerator.java:47)
    at MyClassGenerator.main(MyClassGenerator.java:13)
Note: sun.tools.javac.Main has been deprecated.
1 warning
Running TestHello_1289950330167:

这是代码:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.net.URL;
import java.net.URLClassLoader;

public class MyClassGenerator {
    String generatedClassName = "TestHello_" + System.currentTimeMillis();
    String javaFileName = this.generatedClassName + ".java";

    public static void main(final String args[]) {
        final MyClassGenerator mtc = new MyClassGenerator();
        mtc.createIt();
        if (mtc.compileIt()) {
            System.out.println("Running " + mtc.generatedClassName + ":\n\n");
            mtc.runIt();
        }
        else {
            System.out.println(mtc.javaFileName + " is bad.");
        }
    }

    public void loadIt() {

        final ClassLoader classLoader = MyClassGenerator.class.getClassLoader();

        try {
            final Class aClass = classLoader.loadClass(this.generatedClassName);
            System.out.println("Loaded " + aClass.getName());
        }
        catch (final ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    public void createIt() {
        try {
            final FileWriter aWriter = new FileWriter(this.javaFileName, true);
            aWriter.write("public class " + this.generatedClassName + " { }");
            aWriter.flush();
            aWriter.close();
        }
        catch (final Exception e) {
            e.printStackTrace();
        }
    }

    public boolean compileIt() {
        final String[] source = { new String(this.javaFileName) };
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();

        new sun.tools.javac.Main(baos, source[0]).compile(source);

        System.out.print(baos.toString());

        return (baos.toString().indexOf("error") == -1);
    }

    public void runIt() {
        try {
            final File file = new File(this.javaFileName);
            final URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { file.toURI().toURL() });
            final Class<?> cls = Class.forName(this.generatedClassName, true, classLoader);
        }
        catch (final Exception e) {
            e.printStackTrace();
        }
    }
}

因为它不在类路径中。将其写入类路径(或将其根路径添加到类路径)或使用URLClassLoader http://download.oracle.com/javase/6/docs/api/java/net/URLClassLoader.html.

File root = new File(".");
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName(generatedClassName, true, classLoader);

在中使用相对路径java.io顺便说一句,这是一个坏主意。您依赖于当前工作目录,该目录无法在代码中控制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在使用 Class.forName(...) 时会出现 ClassNotFoundException? 的相关文章

随机推荐

  • Azure Python Flask应用程序-AD身份验证问题

    解释起来可能有点复杂 所以我会尽力而为 目前的解决方案 我有一个 python Flask 应用程序 它将部署到 Azure 中的应用程序服务 我希望用户通过 Azure AD 身份验证登录到应用程序服务 为此 我使用 ADAL 库 因为我
  • mkbundle 和 GTK#

    我正在尝试使用 mkbundle 以便我可以分发 GTK 应用程序 而无需用户安装 NET Mono 或 GTK 我已经成功捆绑了一个使用 winforms 的应用程序 但由于某种原因 当我对 GTK 应用程序执行相同操作时 它无法工作 这
  • 张量流在梯度计算过程中如何处理不可微节点?

    我理解自动微分的概念 但找不到任何解释张量流如何计算不可微函数的误差梯度 例如tf where在我的损失函数中或tf cond在我的图表中 它工作得很好 但我想了解张量流如何通过这些节点反向传播误差 因为没有公式可以计算它们的梯度 如果是t
  • Android getMaxAddressLineIndex 对于第 1 行返回 0

    由于某种原因 getMaxAddressLineIndex 的实现最近发生了变化 现在 该方法对第 1 行返回 0 我有一个现有的代码 它曾经有效 i
  • 没有超级权限无法创建简单的MySQL函数

    我一直在毫无问题地创建存储过程 但是当尝试创建一个返回结果的简单函数时COUNT 在桌子上运行函数 我得到 错误 1418 此函数没有 DETERMINISTIC NO SQL 或 READS 其声明中的 SQL DATA 和二进制日志记录
  • 多线程应用程序无法编译并出现错误链

    我介绍了error chain到以前工作的应用程序中 错误本身很清楚 std error Error static缺乏实施trait std marker Send error E0277 the trait bound std error
  • “Monkey Business”C++ 程序 - 完成 99% [已关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试使用旧教科书自学 C 非常感谢您的意见 我可以在线找到该程序的工作代码 但我想让我的代码在尝试完全不同的方法之前工作 我需要编写一
  • Java中“不鼓励引用”是什么意思?

    我在 Eclipse 的编译器设置中注意到了这个设置 这与 禁止引用 有何不同 来自对已接受答案的评论如何在 Eclipse 中以编程方式打开查找类型对话框 https stackoverflow com questions 1218801
  • 在 AWS RDS Oracle 数据库中导入 .dmp 文件时出错

    我已遵循AWS将数据导入RDS https docs aws amazon com AmazonRDS latest UserGuide Oracle Procedural Importing html guide 我已经复制了 dmp文件
  • 从流中读取多个 protobuf 消息的 python 示例

    我正在处理来自 spinn3r 的数据 它由序列化为字节流的多个不同的 protobuf 消息组成 http code google com p spinn3r client wiki Protostream http code googl
  • 如果没有“typedef”,如何创建在 C# 泛型中使用的相关类型组?

    作为一名 C 背景的人 我遇到过以下情况 鉴于 c 不支持 typedef 如何以编程方式关联类型 也就是说 在 C 中 我可以将相关类型存储为 typedef 以便在与模板一起使用时进行检索 在 C 中无法以同样的方式完成同样的事情 因为
  • 结构数组在排序时给出错误的输出

    1 我有一个结构 struct node char symbol int freq int left right root int value short is sorted struct node data 1000 其中 data 21
  • 父级的 componentDidMount 是否在子级的所有 componentDidMount 之后被调用?

    我的父渲染中有下面的代码 div this state OSMData map function item index return div
  • iOS:移动设备管理

    我对 MDM 有点困惑 希望有人可以帮助我 我已经研究了Apple网站上有关iOS MDM的文档 但仍然感到困惑 我有一些问题 MDM服务器每次需要执行命令时是否都在与APNS通信 设置我们自己的 MDM 服务器是否非常复杂以及如何设置我们
  • 使用 GLFW + GLEW 时 glGenFramebuffers() 访问冲突

    我收到此错误 执行位置 0x00000000 时发生访问冲突 当我在 Windows 上使用 GLFW GLEW 时 我使用的是 Windows 7 我也有自己的实现 从头开始 它创建一个窗口 初始化 OpenGL 上下文 初始化 GLEW
  • Django-compressor、Heroku、S3:请求已过期

    我在 Heroku 上使用 django compressor 和 amazon s3 提供静态文件 并且使用压缩器生成的静态文件链接不断遇到以下错误 我对 compressor 和 s3 完全陌生 https xxx s3 amazona
  • Susy 2:具有流动主要内容区域的固定宽度侧边栏

    使用 Susy 2 候选版本 我试图弄清楚如何创建一个带有固定宽度侧边栏的简单流体布局 无论是左侧位置还是右侧位置 我很高兴使用第一个和最后一个关键字 谁能告诉我如何在 Susy 2 中执行此操作 谢谢你 有几种方法可以混合固定 流体布局
  • 如何检测您的 Android 应用程序是否位于前台 (API 21)

    当收到 GCM 消息时 我的应用程序的行为取决于它是否位于前台 在 API 21 之前 我使用了以下内容 Boolean onForeground this getPackageName equalsIgnoreCase ActivityM
  • 绕局部轴旋转

    我正在尝试实现一个对象 围绕一个位置 POI 兴趣点 飞行并面向它 当您按 WASD 时 您可以更改 POI 的旋转 A 和 D gt 更改 y 轴 W 和 S 更改 x 轴 正如您在演示中看到的 http jsbin com yodusu
  • 为什么在使用 Class.forName(...) 时会出现 ClassNotFoundException?

    在下面的示例中 我尝试使用sun tools javac Main动态编译我生成的类 然后实例化该类的对象并调用方法 到目前为止 我什至无法通过加载生成的类 我在 Eclipse 中遇到以下异常 java lang ClassNotFoun