【问题标题】:Why isn't my class being loaded through the external class loader?为什么我的类没有通过外部类加载器加载?
【发布时间】:2012-06-14 23:49:40
【问题描述】:

我想运行Test2包中Main.class的构造函数,位于文件夹C:\classes\

这是我正在使用的代码。当它试图将它变成一个类时,它会抛出一个类未找到异常。然后一旦它成为类对象的一部分,构造函数会自动运行,还是我必须以某种方式实例化它? Test2 作为文本输入到此代码中。

    if (Main.os.equals("Windows"))
    {
        String path = "C:\\classes\\";
    }
    else
    {
        String path = "~/classes/";
    }

    File file = new File(path);

    try
    {
        URL url = file.toURI().toURL();
        URL[] urls = new URL[]{url};
        Main.print("Stage 1");
        ClassLoader cl = new URLClassLoader(urls);
        Main.print("Stage 2");
        Class cls = cl.loadClass(text + ".Main");
        Main.print(text + " was loaded into memory.");
        close();
    }
    catch (MalformedURLException e)
    {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e)
    {
        e.printStackTrace();
    }

【问题讨论】:

  • 能否把这两个类的完整代码贴出来?
  • 这是与问题相关的唯一部分...此代码位于对话框的 ActionListener 代码中,该对话框为其提供变量文本。另一个类只是在构造函数中执行一个 hello world println。
  • 这并不完全正确。我们还需要 Main 的包和类声明。这些很重要。此外,我们需要text 的值。我们可以从您的评论中推断出文本是“Test2”,但我们不知道!
  • 都是正常的东西,打包Test2;公共类主。通过执行 String text = name.getText(); 将文本设置为字符串;其中 name 是文本框。

标签: java class classloader external classnotfoundexception


【解决方案1】:

我怀疑您的问题是以下之一:

  1. file 不存在或未正确指定。检查通过file.exists()
  2. 您的类文件不在正确的目录中。如果Main 类的包声明是package Test2;,那么您的类文件必须位于以下位置:C:\classes\Test2\Main.class
  3. 如果 Main 是嵌套类,则在加载时需要引用封闭类,例如 cl.loadClass("Test2.EnclosingClass$Main");

我猜你的问题是 2 号! :)

祝你好运。

哦,是的,如果要调用构造函数,则需要创建对象的实例:clazz.newInstance() 是无参数构造函数的最简单方法。

【讨论】:

  • 不是 2 或 3... 我会检查 1. Java 是否没有访问 C:\classes 的权限?
  • 知道如何将新的类实例放在它自己的线程上吗?
  • 你的意思是你希望新实例的构造函数被另一个线程调用?
【解决方案2】:

你能发布确切的错误信息吗?

但这里是我如何执行使用类加载器的主要方法

    urlLoader = new URLClassLoader(urls);

    Class runClass = urlLoader.loadClass(classToRun);
    System.out.println("Starting Program !!!");

    Object[] arguments = new Object[]{args};
    Method mainMethod = runClass.getMethod("main", new Class[] {args.getClass()});
    mainMethod.invoke(null, arguments);

注意: classToRun 将是完整的包/类定义 即 net.sf.RecordEditor.edit.FullEditor

注意:我用它从jar文件中加载,目录类似

取自这里的run类

http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/RecordEditor/src/net/sf/RecordEditor/utils/Run.java?revision=65&view=markup

调用类的例子在这里 http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/RecordEditor/src/net/sf/RecordEditor/RunFullEditor.java?revision=65&view=markup

【讨论】:

  • 变量 classToRun... 在我的代码中,它是与 urlLoader 相同的 ClassLoader 变量。有错吗?
猜你喜欢
  • 2017-08-24
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多