powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему выводит так?
9 сообщений из 9, страница 1 из 1
Почему выводит так?
    #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
Почему выводит так?
    #32707797
SOMNAMBULA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой взгляд программа работает именно так, как и должно работать. С чего это должно выводится на консоль что-то ещё кроме "Class Name: TestModule"?
При создании экземпляра TestModule (через newInstance()) наварняка запускается конструктор по умолчанию этого класса, а он не определён, т.е. можно считать что пустой. Грубо говоря код из класса TestModule не запускается. Таким образом, что бы проверить работу надо код из метода main() класса TestModule перенести в конструктор класса.
Или я что-то не правильно понимаю? Так никогда не пробовал, поэтому могу ошибаться...
...
Рейтинг: 0 / 0
Почему выводит так?
    #32707799
SOMNAMBULA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И можно пояснить, что имелось ввиду под "запуском файла"?
...
Рейтинг: 0 / 0
Почему выводит так?
    #32707859
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я запускаю Loader а он нормально вытаскивает массив байтов(тот же TestModule.class только в ввиде байтов), выводит его имя. А вот запустить TestModule не хочет или не может, не выводится на консоль строка из TestModule "Hi, I'm Dynamic running file", почему? Если default конструктор не может, то как сделать чтобы он мог запустить файл, а не только читал массив байтов. Чтобы прога TestModule запускалась. Как?
...
Рейтинг: 0 / 0
Почему выводит так?
    #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
Почему выводит так?
    #32708207
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SOMNAMBULA:
Подготовь заранее пример, как загружать класс, если он имеет "внутренние классы", т.е. состоит из нескольких *.class файлов :) На словах объяснить опять, наверное, не получится :)
...
Рейтинг: 0 / 0
Почему выводит так?
    #32709578
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорош прикаловатся
автор
На словах объяснить опять, наверное, не получится :)
...
Рейтинг: 0 / 0
Почему выводит так?
    #32709719
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дийствительно, ребята!!! Прекращайте в конце концов!
...
Рейтинг: 0 / 0
Почему выводит так?
    #32711389
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VortexCorbaХорош прикаловатся
автор
На словах объяснить опять, наверное, не получится :)


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


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