为什么我的班级不是通过外部类加载器加载的?

时间:2012-06-14 23:49:40

标签: java class classloader external classnotfoundexception

我想运行位于文件夹C:\ classes \

中的包Test2中Main.class的构造函数

这是我正在使用的代码。当它试图将它变成一个类时,它抛出一个类未找到的异常。然后,一旦它是类对象的一部分,构造函数会自动运行,还是我必须以某种方式实例化它? 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();
    }

2 个答案:

答案 0 :(得分:1)

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

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

    祝你好运。

    哦,是的,如果你想要调用构造函数,你需要创建一个对象的实例:clazz.newInstance()是no-args构造函数的最简单方法。

答案 1 :(得分:0)

您能否发布确切的错误消息。

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

    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文件加载,它与目录类似

取自此处的运行类

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

相关问题