device Телепаты в отпуске.. Приведи код и обстоятельства возникновения ошибки. Скорее всего JVM тут не при чем.
Прога останавливается. Вот код Код (Text): /** MagicReflex Linking unknown object code into a main program ----------- Связывание объектного кода с основной программой **/ SelectingObject = so; // Pointer to object code StringTokenizer ST = new StringTokenizer (so.getClass().getCanonicalName(),"."); String ClassName = null; while (ST.hasMoreElements()) { ClassName=ST.nextToken(); } System.out.println(new AnnotationAdapter().getAnnotation(ClassName)); Field[] so_f = so.getClass().getDeclaredFields(); for (int i=0; i<so_f.length; i++) { if (so_f[i].getType()==String.class) { EntityManagerFactory factory; EntityManager manager; factory = Persistence.createEntityManagerFactory("YACRM_CPU"); manager = factory.createEntityManager(); Query query = manager.createQuery(FQ1+ClassName+ASQ1+so_f[i].getName()+FQ2); List list = (List) query.getResultList(); for (Iterator iterator = list.iterator(); iterator.hasNext();) { Object obj = iterator.next(); if (obj!=null) { //Определяем что код - родной для исполняющей системы System.out.println("SPACE ["+new AnnotationAdapter().getAnnotation(obj.getClass().getPackage().getName())+"::"+new AnnotationAdapter().getAnnotation(ClassName)+"]"); //Определяем что присутствуют нужные секции System.out.println("\t SECTION: \""+new AnnotationAdapter().getAnnotation(so_f[i].getName())+"\""); Class obj_c = obj.getClass(); Method obj_id_m = obj_c.getMethod("getId"); System.out.println(obj_id_m.invoke(obj_c.getDeclaredField("id").getType())); // Тут баг. Или я пьяный или JVM мутит. } } } Щас буду другой способ искать - это я чето намутил вчера. Гугл мой друг на сегодня.
Исправил. вот вывод проги Код (Text): SPACE[CO::Address] SECTION "CTR" at address: <14 OBJECT_HASH= 14> SPACE[CO::Address] SECTION "CTR" at address: <13 OBJECT_HASH= 13> вместо ошибки преобразования PS: А какие существуют общие алгоритмы/приемы связывания неизвестного кода с основной прогой? Как правильно сканировать секции, поля? (Может есть алгоритмы для этого). Какие опасности поджидают при работе?
device этот код имплементирует какой-то интерфейс, который знает примари программа к интроспекции прибегают не часто. ты сборную солянку мутить собрался?
wsd Нет. Поисковик пишу Вот щас отформатировал вывод проги: Код (Text): Результаты поиска по запросу: Оренбург --------------------------------- Общие сущности::Адрес В поле: Город В объекте 13 По адресу 13 Общие сущности::Адрес В поле: Область или штат В объекте 13 По адресу 13 Общие сущности::Адрес В поле: Район В объекте 13 По адресу 13
device Can not set java.lang.Integer to java.lang.Integer Раз речь идет о Reflection, то такая ошибка может возникнуть, если класс (здесь java.lang.Integer) загружен два раза через разные Classloader'ы. Тогда их нельзя присвоить друг другу, хоть и называются одинаково. Можешь опросить имена Classloader'ов и сравнить.
Stiver Я понял уже. Исправил. Спасибо. Просто как-то неожиданно, думал баг. Гугл изменил мою точку зрения. wsd Имеешь в виду прокси? Если бы! Максимум че он имплементирует - это Serializable))) Смысл тут такой: На входе получаем ссылку на некоторый код. Подразумеваем, что он содержит методы и поля, у него нет вложенных классов, не ссылок. Какие методы, что они возвращают и что делают, мы не знаем. Но мы можем их "нежно пощупать", просканировать процедурой getAnnotation() (там всего 10 строк кода) и определить, что делает каждый метод. Некоторый код создается неизвестно кем и неизвестно как. А наша задача его понять на программном уровне и исполнить.
device ты сам себе бомбу закладываеш ну раз GOF осилил начинай RUP IBM на русском в сети есть путные переводы если что, залью на рапиду. в любом приличном проекте сначала проектируются интерфейсы и строиться взаимодействие на их основе. А потом уже пишутся классы имплементаторы. Если проект с твоей архитектурой приобретёт боле-менее приличный размер - он тебя раздавит. прокси нужен для подмены конкретной(локальной или удалённой) реализации, а у тебя по рассказу этого не наблюдается.
У него уже приличный размер. Этот алгоритм я использую только в одном месте. MagicReflex - компромисс между громоздскими запросами на сервер.