2012-06-14 3 views
0

Я хочу запустить конструктор Main.class в пакете Test2, который находится в папке 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(); 
    } 
+0

Не могли бы вы высказать полный код обоих классов? – Muel

+0

Это единственная часть, которая относится к вопросу ... Этот код находится в коде ActionListener для диалогового окна, которое передает его переменному тексту. Другой класс просто делает hello world println в конструкторе. – Paulywog

+0

Это не совсем так. Нам также нужны объявления пакетов и классов для Main. Это важно. Кроме того, нам нужно значение 'text'. Мы можем сделать вывод из вашего комментария, что текст «Test2», но мы не знаем! – Muel

ответ

1

Я подозреваю, что ваша проблема одна из следующих:

  1. file не существует или не был указан правильно. Проверка через file.exists()
  2. Ваш файл класса не находится в нужном каталоге. Если объявление пакета для класса Main равно package Test2;, то ваш файл класса должен находиться в следующем местоположении: C:\classes\Test2\Main.class.
  3. Если Main является вложенным классом, то вам нужно будет обратиться к объемлющему классу при загрузке его, например, cl.loadClass("Test2.EnclosingClass$Main");

Моих догадаться, что ваша проблема номер 2! :)

Удачи.

О, и да, вам нужно создать экземпляр вашего объекта, если вы хотите, чтобы конструктор вызывался: clazz.newInstance() - это самый простой метод для конструкторов no-args.

+0

Это не 2 или 3 ... Я проверю 1. Может ли Java не иметь разрешений на доступ к C: \ classes? – Paulywog

+0

Это было 1. Вау ... Ну, спасибо, я думаю. – Paulywog

+0

Любая идея, как поместить новый экземпляр класса в его собственный поток? – Paulywog

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

+0

Переменная classToRun ...в моем коде это одна и та же переменная ClassLoader как urlLoader. Это неправильно? – Paulywog

Смежные вопросы