0

我想在文件夹 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();
    }
4

2 回答 2

1

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

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

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

祝你好运。

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

于 2012-06-15T03:55:53.897 回答
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

于 2012-06-15T01:35:24.630 回答