Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему выводит так? / 9 сообщений из 9, страница 1 из 1
23.09.2004, 08:57
    #32707784
VortexCorba
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
Есть прога:
Вытаскивает из БД *.class файл.
Все в массиве байтов. Все ок, но:
Результат такой:
Код: plaintext
1.
Class Name: TestModule
т.е только название файла выводит. А сам файл не запускает, почему?
Ниже код ClassLoader-а:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
package dynamicclassoverloader;
import java.sql.*;
class MyClassLoader extends ClassLoader {
  public Class LoadClass(byte[] bytes) {
    return defineClass(null, bytes, 0, bytes.length);
  }
}
class Loader {
  public static void main(String args[]) throws Exception{
    try {
      MyClassLoader loader = new MyClassLoader();
      Connection connect = DB2Connector.getConnect();
      Statement stm = connect.createStatement();
      String SQLQuery = "SELECT * FROM run";
      byte bytes[] = null;
      ResultSet result = stm.executeQuery(SQLQuery);
      while (result.next()) {
        bytes = result.getBytes(1);
      }
      byte byteslast[] = bytes;
      Class xxx = loader.LoadClass(byteslast);
      System.out.println("Class Name: " + xxx.getName());
      Class clazz = Class.forName(xxx.getName(), true, loader);
      Object object = clazz.newInstance();
      
    } catch(Exception e){
      System.out.println("CANN'T FIND THE BYTE VARIANT OF THE FILE OR SQL ERROR");
    }
        
        
  }
}
Хотя на самом деле он должен был запустить класс TestModule.class которого из БД вытащил. А вот код TestModule.class которого залил в таблицу:
Код: plaintext
1.
2.
3.
4.
5.
public class TestModule {
  public static void main(String args[]) {
    System.out.println("Hi, I'm Dynamic running file");
  }
}
Подскажите пожалуйста, чего в коде Loader не хватает?
...
Рейтинг: 0 / 0
23.09.2004, 09:07
    #32707797
SOMNAMBULA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
На мой взгляд программа работает именно так, как и должно работать. С чего это должно выводится на консоль что-то ещё кроме "Class Name: TestModule"?
При создании экземпляра TestModule (через newInstance()) наварняка запускается конструктор по умолчанию этого класса, а он не определён, т.е. можно считать что пустой. Грубо говоря код из класса TestModule не запускается. Таким образом, что бы проверить работу надо код из метода main() класса TestModule перенести в конструктор класса.
Или я что-то не правильно понимаю? Так никогда не пробовал, поэтому могу ошибаться...
...
Рейтинг: 0 / 0
23.09.2004, 09:09
    #32707799
SOMNAMBULA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
И можно пояснить, что имелось ввиду под "запуском файла"?
...
Рейтинг: 0 / 0
23.09.2004, 09:49
    #32707859
VortexCorba
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
Я запускаю Loader а он нормально вытаскивает массив байтов(тот же TestModule.class только в ввиде байтов), выводит его имя. А вот запустить TestModule не хочет или не может, не выводится на консоль строка из TestModule "Hi, I'm Dynamic running file", почему? Если default конструктор не может, то как сделать чтобы он мог запустить файл, а не только читал массив байтов. Чтобы прога TestModule запускалась. Как?
...
Рейтинг: 0 / 0
23.09.2004, 10:45
    #32707968
SOMNAMBULA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
Чтобы "прога" TestModule "запускалась" - надо её запустить:

Код: plaintext
1.
TestModule tm = (TestModule)clazz.newInstance();
tm.main(null);

Здесь предполагается, что вызывающей программе известен класс TestModule. Возможна ситуация, когда он "не известен". В этом случае можно использовать механизм отражения:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
package test;

public class Class2 
{
  public Class2()
  {
    System.out.println("Hello from constructor!");
  }

  public static void main()
  {
    System.out.println("Hello from main method!");
  }
}

И класс, который использует вышеуказанный (пускай "запускает" если так больше нравиться)...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
package test;

public class Class1 
{
  public static void main(String[] args)
  {
    try {
      Class c = Class.forName("test.Class2");
      Object c2 = c.newInstance();
      java.lang.reflect.Method m = c.getDeclaredMethod("main", null);      
      m.invoke(c2, null);
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
}


После работы указанного кода на консоли у меня следующее:

Код: plaintext
1.
2.
Hello from constructor!

Hello from main method!

Этот код рабочий. В твоём случае можно организовать работу в таком же духе. Естесственно, я предполагаю, что загрузка класса из базы данных прошла успешно (я так предполагаю, что ты не говоришь о каких либо ошибках в вызове clazz.newInstance()

На мой взгляд вот так вот...
...
Рейтинг: 0 / 0
23.09.2004, 12:30
    #32708207
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
2SOMNAMBULA:
Подготовь заранее пример, как загружать класс, если он имеет "внутренние классы", т.е. состоит из нескольких *.class файлов :) На словах объяснить опять, наверное, не получится :)
...
Рейтинг: 0 / 0
24.09.2004, 06:59
    #32709578
VortexCorba
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
Хорош прикаловатся
автор
На словах объяснить опять, наверное, не получится :)
...
Рейтинг: 0 / 0
24.09.2004, 09:46
    #32709719
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
Дийствительно, ребята!!! Прекращайте в конце концов!
...
Рейтинг: 0 / 0
25.09.2004, 02:31
    #32711389
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему выводит так?
VortexCorbaХорош прикаловатся
автор
На словах объяснить опять, наверное, не получится :)


Извини, настроение у меня было плохое :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему выводит так? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]