Баг в JVM: преобразование типов

Тема в разделе "WASM.ZEN", создана пользователем device, 22 апр 2008.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Код (Text):
    1. Can not set java.lang.Integer to java.lang.Integer
    Что это?
    Кто -нить уже сталкивался?
     
  2. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    device

    Телепаты в отпуске.. Приведи код и обстоятельства возникновения ошибки. Скорее всего JVM тут не при чем.
     
  3. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    device
    а в чём смысл конвертить тип в сам себя?? если это и баг - он не страшен.
     
  4. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Прога останавливается.

    Вот код
    Код (Text):
    1. /**
    2. MagicReflex
    3. Linking unknown object code into a main program
    4. -----------
    5. Связывание объектного кода с основной программой
    6. **/
    7.  
    8. SelectingObject = so; // Pointer to object code
    9.        
    10.        StringTokenizer ST = new StringTokenizer (so.getClass().getCanonicalName(),".");
    11.        String ClassName = null;
    12.       while (ST.hasMoreElements())
    13.        {
    14.          
    15.             ClassName=ST.nextToken();
    16.    
    17.        }
    18.        
    19.        System.out.println(new AnnotationAdapter().getAnnotation(ClassName));
    20.  
    21.        
    22.        Field[] so_f = so.getClass().getDeclaredFields();
    23.        
    24.        for  (int i=0; i<so_f.length; i++)
    25.        {
    26.  
    27.     if (so_f[i].getType()==String.class)
    28.     {
    29. EntityManagerFactory factory;
    30. EntityManager manager;
    31.  
    32.     factory = Persistence.createEntityManagerFactory("YACRM_CPU");
    33.     manager = factory.createEntityManager();
    34.     Query query = manager.createQuery(FQ1+ClassName+ASQ1+so_f[i].getName()+FQ2);
    35.        
    36.     List list = (List) query.getResultList();
    37.    
    38.     for (Iterator iterator = list.iterator(); iterator.hasNext();) {
    39.         Object obj = iterator.next();
    40.         if (obj!=null)
    41.         {
    42. //Определяем что код - родной для исполняющей системы
    43.             System.out.println("SPACE ["+new AnnotationAdapter().getAnnotation(obj.getClass().getPackage().getName())+"::"+new AnnotationAdapter().getAnnotation(ClassName)+"]");
    44. //Определяем что присутствуют нужные секции
    45.                 System.out.println("\t SECTION:   \""+new AnnotationAdapter().getAnnotation(so_f[i].getName())+"\"");
    46.                      
    47.                 Class obj_c = obj.getClass();
    48.                 Method obj_id_m = obj_c.getMethod("getId");
    49.                 System.out.println(obj_id_m.invoke(obj_c.getDeclaredField("id").getType()));
    50.                
    51.                // Тут баг. Или я пьяный или JVM мутит.
    52.                
    53.         }
    54.     }
    55.     }
    Щас буду другой способ искать - это я чето намутил вчера. Гугл мой друг на сегодня.
     
  5. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Исправил.
    вот вывод проги
    Код (Text):
    1. SPACE[CO::Address]
    2.          SECTION "CTR"
    3.          at address: <14 OBJECT_HASH= 14>
    4. SPACE[CO::Address]
    5.          SECTION "CTR"
    6.          at address: <13 OBJECT_HASH= 13>
    7.  
    8. вместо ошибки преобразования
    PS: А какие существуют общие алгоритмы/приемы связывания неизвестного кода с основной прогой?
    Как правильно сканировать секции, поля? (Может есть алгоритмы для этого). Какие опасности поджидают при работе?
     
  6. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    device
    этот код имплементирует какой-то интерфейс, который знает примари программа ;)
    к интроспекции прибегают не часто.
    ты сборную солянку мутить собрался?
     
  7. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    wsd
    Нет.
    Поисковик пишу:)

    Вот щас отформатировал вывод проги:
    Код (Text):
    1. Результаты поиска по запросу: Оренбург
    2.  ---------------------------------
    3. Общие сущности::Адрес
    4. В поле: Город
    5. В объекте 13 По адресу 13
    6.  
    7. Общие сущности::Адрес
    8. В поле: Область или штат
    9. В объекте 13 По адресу 13
    10.  
    11. Общие сущности::Адрес
    12. В поле: Район
    13. В объекте 13 По адресу 13
     
  8. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    device
    Can not set java.lang.Integer to java.lang.Integer

    Раз речь идет о Reflection, то такая ошибка может возникнуть, если класс (здесь java.lang.Integer) загружен два раза через разные Classloader'ы. Тогда их нельзя присвоить друг другу, хоть и называются одинаково. Можешь опросить имена Classloader'ов и сравнить.
     
  9. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Stiver
    Я понял уже. Исправил. Спасибо.
    Просто как-то неожиданно, думал баг. Гугл изменил мою точку зрения.

    wsd
    Имеешь в виду прокси?
    Если бы!
    Максимум че он имплементирует - это Serializable:))))
    Смысл тут такой:
    На входе получаем ссылку на некоторый код.
    Подразумеваем, что он содержит методы и поля, у него нет вложенных классов, не ссылок.
    Какие методы, что они возвращают и что делают, мы не знаем.
    Но мы можем их "нежно пощупать", просканировать процедурой getAnnotation() (там всего 10 строк кода) и определить, что делает каждый метод. Некоторый код создается неизвестно кем и неизвестно как.
    А наша задача его понять на программном уровне и исполнить.
     
  10. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    device
    ты сам себе бомбу закладываеш:)
    ну раз GOF осилил начинай RUP IBM на русском в сети есть путные переводы;)
    если что, залью на рапиду.
    в любом приличном проекте сначала проектируются интерфейсы и строиться
    взаимодействие на их основе. А потом уже пишутся классы имплементаторы.
    Если проект с твоей архитектурой приобретёт боле-менее приличный размер -
    он тебя раздавит.
    прокси нужен для подмены конкретной(локальной или удалённой) реализации, а у тебя по рассказу этого не наблюдается.
     
  11. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    У него уже приличный размер. Этот алгоритм я использую только в одном месте. MagicReflex - компромисс между громоздскими запросами на сервер.