powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Превращение байтов в class файлы
17 сообщений из 17, страница 1 из 1
Превращение байтов в class файлы
    #32705556
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такая проблема:
Есть BLOB поле где в массиве байтов хранится class файл
Код: plaintext
1.
2.
ResultSet rs = stmt.exeuteQuery("Select byteArray From table where id = 02");
       byte[] result = new byte[(int)rs.getBytes(byteArray).length];
Так можно вытащить байты из BLOB поле?
Если можно то идем дальше:
Нужно чтобы этот массив байтов превратился в файл.
Как сделать такое?
Вот пишу говорит ошибка:
Код: plaintext
1.
2.
3.
        FileInputStream fr = new FileInputStream(rs.getBytes(byteArray).toString());
        fr.read(result, 0, result.length);
        fr.close();
Посоветуйте как можно массив байтов в File объект превратить?
И как можно из превращенного в File оъекта узнать название class файла?
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #32705986
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это поможет: Retrieving Data from BLOB into a file Упоминается работа с Oracle (можно предположить, что именно он имеется в виду, по типу BLOB) но ИМХО сойдет и для других БД.
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #32706286
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VortexCorba
Код: plaintext
1.
2.
ResultSet rs = stmt.exeuteQuery("Select byteArray From table where id = 02");
       byte[] result = new byte[(int)rs.getBytes(byteArray).length];
Так можно вытащить байты из BLOB поле?

ResultSet#getBytes() возвращает в виде массива байт то, что вернул db driver.
Правильнее было бы использовать метод ResultSet#getBlob("xxx") и уже у него дёргать getBytes() или getBinaryStream().
"new byte[(int)rs.getBytes(byteArray).length];" - создаётся массив, но не заполняется значениями (каст (int) тоже непонятно к чему). Так ничего не вытащить :)


Если можно то идем дальше:
Код: plaintext
1.
2.
3.
        FileInputStream fr = new FileInputStream(rs.getBytes(byteArray).toString());
        fr.read(result, 0, result.length);
        fr.close();


Ещё бы, в конструкторе FileInputStream(String) указывается имя файла, а не абы что. Если нужно заполнить массив result значениями из массива rs.getBytes(), то так и делай, либо в цикле, либо через System.arrayсopy(), либо тупым присвоением result = rs.getBytes(), если этому ничего не мешает.

Если нужно скинуть содержимое blob'a в файл, то пожалуйста:
Blob b = rs.getBlob("xxx");
InputStream is = b.getBinaryStream();
FileOutputStream fos = new FileOutputStream("xxx.tmp");
...
fos.close();

Что значит хранится "class файл"? Cодержимое *.class?
Если нужно загрузить класс, то нужно переопределить классЛоадер. Писать байты в файл не обязательно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        class MyClassLoader extends ClassLoader{
            public Class loadClass(byte[] bytes) {
                return defineClass(null, bytes,0, bytes.length);
            }
        }

         //somewhere 
        MyClassLoader loader = new MyClassLoader();
        Class xxx = loader.loadClass(bytes);
        System.out.println("Class Name: " + xxx.getName());


Только какой смысл пихать в базу данных класс файлы?
От этого будет больше проблем чем пользы, imho.
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #32706431
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только какой смысл пихать в базу данных класс файлы? От этого будет больше проблем чем пользы, imho.
Иногда бывают нужны совсем непонятные весчи :)
Хотел как то сделать похожую штуку. Но решил сделать проще и не хранить классы в бд, а только их полные названия.
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #32706527
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Loader {
  public static void main(String args[]) throws Exception{
    MyClassLoader loader = new MyClassLoader();
    Connection connect = DB2Connector.getConnect();
    Statement stm = connect.createStatement();
    String SQLQuery = "SELECT * FROM cisu.cfiles WHERE Month = '02'";
    ResultSet result = stm.executeQuery(SQLQuery);
    Blob b = result.getBlob("msg");
    byte bytes[] = b.getBytes(b.length());
    Class xxx = loader.LoadClass(bytes);
    System.out.println("Class Name: " + xxx.getName());
  }
}
Вот так написал. Он вызывает ошибку на этом месте:
Код: plaintext
1.
    byte bytes[] = b.getBytes(b.length());
Что может быть?
А как наоборот залить в таблицу class файл?
Напишите пример пожалуйста.
Заливаю и вытаскиваю class файл потому что все это на MainFrame - е работать будет. Там не извесно как себя поведет прога если будет лежать на диске.
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #32706776
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot VortexCorba
Код: plaintext
1.
  byte bytes[] = b.getBytes(b.length());
Что может быть?[/quot]
А такой метод разве есть? Есть метод Blob#getBytes(long pos, int length);

Если уж зашла речь про ошибки, то стоит писать хотя бы их название :)
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #32707606
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sql.ru/forum/actualthread.aspx?tid=121946
По-моему, было разжевано дальше некуда.
PS. Фирма - бизнес-партнер IBM? Интересно как у вас там распространены iSeries, zSeries, какой круг задач решаете на них?
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #32707720
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор
PS. Фирма - бизнес-партнер IBM? Интересно как у вас там распространены iSeries, zSeries, какой круг задач решаете на них?

Нет, как там IBM. Пишем для одной компании, просто я в Жава новичек и все.
Blob b.getBytes(long pos, int legth);
здесь pos - position?
т.е с какой позиции читать массив байтов?
автор
class MyClassLoader extends ClassLoader{
public Class loadClass(byte[] bytes) {
return defineClass(null, bytes,0, bytes.length);
}
}
..................
//somewhere
MyClassLoader loader = new MyClassLoader();
Class xxx = loader.loadClass(bytes);
System.out.println("Class Name: " + xxx.getName());


Вот так таписал, все классно. Но я никак не могу понять что именно запускает класс файла?
метод defineClass? Вроде бы он только массив байтов в файл превращает и все.
Если написать так как ты писал то он скорее всего массив байтов превратит м файл и все. На этом и остановится.
Каково твое мнение об этом?
автор
...........
return defineClass(null, bytes,0, bytes.length);
...........

null - можно писать? т.е файл без названии?
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #32707816
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VortexCorbaВот так таписал, все классно. Но я никак не могу понять что именно запускает класс файла?
метод defineClass? Вроде бы он только массив байтов в файл превращает и все.
Если написать так как ты писал то он скорее всего массив байтов превратит м файл и все. На этом и остановится.
Каково твое мнение об этом?

Массив превращается не в файл, а в описание класса. Пользоваться этим описанием можно по рефлекшину. Смотри методы класса Сlass.

...........
return defineClass(null, bytes,0, bytes.length);
...........
null - можно писать? т.е файл без названии?

Не файл без названия, а класс.
Ты ведь не знаешь имя класса. После того как ты его загрузил, ты можешь узнать его имя (см.методы класса Сlass).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Превращение байтов в class файлы
    #33285969
Страждущий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, помогите!! =)

Я и так и эдак пишу свой лоадер. Типа такого:

public Class loadClass(String name) throws ClassNotFoundException {
byte[] data = loadClassData(name);
return defineClass(null, data, 0, data.length);
}

Стал смотреть под отладчиком.
При выполнении defineClass(), программа не возвращает значение, а как бы прыгает снова на первую строку, loadClassData(name), и значение name уже не нужный мне класс, а java.lang.Object. Далее, она пытается его найти по тому же пути, что и нужный мне класс, конечно не находит и бросает эксепшн.

Нафига она ищет java.lang.Object?
Класс который я пытаюсь загрузить очень простой, он "пустой":
ClassForLoad{}

В чем может быть проблема?
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #33286072
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public   class  SimpleClassLoader  extends  ClassLoader {
   private   Class  clazz;
   private   byte [] clazzBytes; // сюда попадает класс (его байтовое представление)
  
   public   Class  getClazz() {
     if  (clazz ==  null ) {
      clazz = defineClass("name", clazzBytes,  0 , clazzBytes.length);
      resolveClass(clazz);
    }
     return  clazz;
  }

  ...
}
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #33286138
Страждущий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to А.Грасоff™
Ну в общем-то так. У меня все то же. Но странное поведение во время defineClass(). Нафига он пытается загрузить еще один класс, если надо просто сделать define нужного мне класса?
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #33286166
Страждущий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще что добавлю.

Зачем мне это надо: в спецификации VM вроде бы сказано, что класс характеризуется не только полным именем, но и своим загрузчиком.
Мне надо загрузить VM кучей-кучей классов. Вот я беру newInstance своего загрузчика и пытаюсь загрузить им один класс, затем другой instance и опять гружу, а в итоге должны получиться разные классы. Но грузить должен не системный загрузчик, чтобы экземпляры загрузчиков были разные.

Вот как сделать, чтобы мой загрузчик не делегировал загрузку где-то внутри себя системным загрузчикам? Вот начерта он пытается грузить java.lang.Object, который приходится грузить системным загрузчиком, и это все портит?
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #33286313
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот начерта он пытается грузить java.lang.Object
любой класс Java обязан наследоваться от java.lang.Object и никуда от этого не денешься.
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #33287327
Страждущий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to wessen
Ну вообще да. Только этот класс по идее уже должен быть загружен и так. А второй раз его не должны грузить.
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #33287819
space_center
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Системный загрузчик вначале ищет класс среди загруженных, если не находит, то тогда загружает. Так что класс java.lang.Object два раза считываться не будет
...
Рейтинг: 0 / 0
Превращение байтов в class файлы
    #33289814
Страждущий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to space_center

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


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