Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> (AnyClass)java.awt.Component, ClassCastException - как обойти ? 
:(
    Опции темы
vvvictor
Дата 11.1.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 7.3.2006

Репутация: нет
Всего: нет



Доброе время суток.
Код
public String ParseCont(int i, java.awt.Container cont) {
        String zzz = "\n\r-- " + i + ". --------------------------------------------------------";
        for(int j=0; j < cont.getComponentCount(); j++) {
            java.awt.Component cmpt = cont.getComponent(j);
            zzz += "\n\r" + cmpt.getName() + "<--*-->" + cmpt.getClass();
            if(cmpt.getName() != null) {
                try {
                    if(cmpt.getName().indexOf("AnyText")!=-1) {
                        zzz += ("\n\rПытаемся хапнуть поле");
                        if(cmpt instanceof AnyClass) {
                          zzz += ("\n\r" + (AnyClass)cmpt.getText());
                        }
                    }
                } catch(Exception ex) { zzz += ("\n\r" + ex + "\n\r");  }
            }
            if(cmpt instanceof java.awt.Container) zzz += ParseCont(i+1, (java.awt.Container)cmpt);
        }
        return zzz;
}
Есть апплет наследованный от другого апплета.
Делаю рекурсивный обход по нему приведенной функцией
cmpt instanceof AnyClass возвращает false
cmpt.getClass().getName() возвращает AnyClass
если ремирую проверку instanceof ловлю ClassCastException AnyClass cannot be cast to AnyClass

Небольшое дополнение - исходный апплет берет свою родословную от javax.swing.JApplet.

Подскажите, плиз, где я туплю  smile 
PM   Вверх
nornad
Дата 11.1.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Почему-то мне кажется, что здесь
Код

(AnyClass)cmpt.getText()

надо делать так
Код

((AnyClass)cmpt).getText()



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
vvvictor
Дата 11.1.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 7.3.2006

Репутация: нет
Всего: нет



nornad, Делал - не пролазит...........

Причем заметь говорит, что не может сделать приведение типа самому себе же........... (AnyClass cannot be cast to AnyClass)

PM   Вверх
w1nd
Дата 11.1.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Разные классы? Разные загрузчики?


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
nornad
Дата 12.1.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Ну, тогда вычленяй из своего кода небольшой пример, в котором это также не будет работать, и закидывай сюда.
Только сначала вычлени этот пример, а не просто отбрось явно ненужное. Сюда уже нужна, так сказать, квинтэссенция примера неработоспособности.
Пока будешь вычленять есть вероятность самому разобраться с проблемой. smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
vvvictor
Дата 12.1.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 7.3.2006

Репутация: нет
Всего: нет



Код
public class FalseApplet extends OtherApplet2 {

    public void DoMyAction() {
        String zzz = "\n\r";
        try {
            zzz += ("zapp==" + this.getName());
            zzz+=ParseCont(1, this.getContentPane());
            this.repaint();
        } catch(Exception ex) {
            ex.printStackTrace();
        } 
        System.out.println(zzz);
    }

    public String ParseCont(int i, java.awt.Container cont) {
            String zzz = "\n\r-- " + i + ". --------------------------------------------------------";
            for(int j=0; j < cont.getComponentCount(); j++) {
                java.awt.Component cmpt = cont.getComponent(j);
                zzz += "\n\r" + cmpt.getName() + "<--*-->" + cmpt.getClass();
                if(cmpt.getName() != null) {
                    try {
                        if(cmpt.getName().indexOf("AnyText")!=-1) {
                            zzz += ("\n\rПытаемся хапнуть поле");
                            if(cmpt instanceof AnyClass) {
                              zzz += ("\n\r" + (AnyClass)cmpt.getText());
                            }
                        }
                    } catch(Exception ex) { zzz += ("\n\r" + ex + "\n\r");  }
                }
                if(cmpt instanceof java.awt.Container) zzz += ParseCont(i+1, (java.awt.Container)cmpt);
            }
            return zzz;
    }
}
Все - вот полный код
Существенное замечание: DoMyAction() вызывается JavaScript-ом из web-странцы....................

PM   Вверх
batigoal
Дата 12.1.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



vvvictor, это никак не есть законченный пример.

Класса OtherApplet2 у нас нет.
Класса AnyClass у нас нет.
Метод DoMyAction нигде в коде не вызывается.
Если поправить все предыдущие недочёты, то всё равно нужно чем-то набить contentPane, иначе цикл выполнится 0 раз.

Тут, конечно, трудолюбивый народ, но допиливать твой код, чтобы он запустился, а потом еще искать ошибку - дело неблагодарное. Так что или подработай этот фрагмент до запускаемости, или хотя бы прикрепи весь проект целиком.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
vvvictor
Дата 12.1.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 7.3.2006

Репутация: нет
Всего: нет



Цитата(batigoal @ 12.1.2008,  14:58)
vvvictor, это никак не есть законченный пример.

Класса OtherApplet2 у нас нет.
Класса AnyClass у нас нет.
Метод DoMyAction нигде в коде не вызывается.
Если поправить все предыдущие недочёты, то всё равно нужно чем-то набить contentPane, иначе цикл выполнится 0 раз.

Тут, конечно, трудолюбивый народ, но допиливать твой код, чтобы он запустился, а потом еще искать ошибку - дело неблагодарное. Так что или подработай этот фрагмент до запускаемости, или хотя бы прикрепи весь проект целиком.

Дело в том, что у меня тоже нет этих классов. А про DoMyAction я уже написал, что вызываю его в JS коде в web-странице.............

Оба эти класса от меня официально скрыты, хотя я кое-что декомпиллировал чтоб подсмотреть...... Сам мой код работает и печатает мне в JavaConsole полное "дерево" элементов из апплета.

Общая ситуация следущая: У меня есть коммерческое приложение, которое может работать и как приложение и как апплет. Все его классы я просто подцепляю к своему проекты как библиотеки и, соответственно, прописываю в веб-странице его jar-а как требуемые для работы архивы........ Я хочу "автоматизировать" для себя некоторые функции этого приложения. Для этого я создал приведенную обертку - потому как "автоматизатор" должен работать из веб.......

Добавлено через 6 минут и 5 секунд
Предоставить само приложение я могу (вернее ссылку на него) но врятли кто сможет промоделировать - так-как само приложение является толстым клиентом к третьей системе, к которой есть доступ не у всех.............

Сейчас попробую еще промоделироваться на абстрактной ситуации...........  
PM   Вверх
batigoal
Дата 12.1.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(vvvictor @  12.1.2008,  16:09 Найти цитируемый пост)
Дело в том, что у меня тоже нет этих классов

Можно и не исходники, а просто либу или скомпилированный class-файл (с зависимостями, конечно).

Попробуй пройтись дебагом - может, у тебя просто два класса с именем AnyClass в системе? Проверь полное имя классов.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
vvvictor
Дата 12.1.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 7.3.2006

Репутация: нет
Всего: нет



Ничего не понимаю......... Промоделировал ситуацию:
Проект: OtherApplet2.jar
Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.vvv.baseapplet;

/**
 *
 * @author Victor
 */
public class AnyClass extends javax.swing.JTextField {

}
Код

/*
 * OtherApplet2.java
 *
 * Created on 12 Январь 2008 г., 17:18
 */

package org.vvv.baseapplet;

/**
 *
 * @author  Victor
 */
public class OtherApplet2 extends javax.swing.JApplet {
    
    /** Initializes the applet OtherApplet3 */
    @Override
    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new org.vvv.baseapplet.AnyClass();

        jLabel1.setText("Метка");
        jLabel1.setName("lblField"); // NOI18N

        jTextField1.setText("МоеПоле");
        jTextField1.setName("txtField"); // NOI18NT

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(27, 27, 27)
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(409, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(38, 38, 38)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(242, Short.MAX_VALUE))
        );
    }// </editor-fold>
    
    
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    // End of variables declaration
    private org.vvv.baseapplet.AnyClass jTextField1;
       
}

Проект: FalseStub.jar
Код
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.vvv.test;

import org.vvv.baseapplet.OtherApplet2;

/**
 *
 * @author vvvictor
 */
public class FalseApplet extends OtherApplet2 {

    /**
     * Initialization method that will be called after the applet is loaded
     * into the browser.
     */
    
    public void DoMyAction() {
        String zzz = "\n\r";
        try {
            zzz += ("zapp==" + this.getName());
            zzz+=ParseCont(1, this.getContentPane());
            this.repaint();
        } catch(Exception ex) {
            ex.printStackTrace();
        } 
        System.out.println(zzz);
    }
    public String ParseCont(int i, java.awt.Container cont) {
        String zzz = "\n\r-- " + i + ". --------------------------------------------------------";
        for(int j=0; j < cont.getComponentCount(); j++) {
            java.awt.Component cmpt = cont.getComponent(j);
            zzz += "\n\r" + cmpt.getName() + " <--*--> " + cmpt.getClass();
            if(cmpt.getName() != null) {
                try {
                    if(cmpt.getName().indexOf("txtField")!=-1) {
                        zzz += ("\n\rСмотрим что творится");
                        if(cmpt instanceof org.vvv.baseapplet.AnyClass) {
                          zzz += ("\n\r" + ((org.vvv.baseapplet.AnyClass)cmpt).getText());
                          ((org.vvv.baseapplet.AnyClass)cmpt).setText("Фиг вам");
                          zzz += ("\n\r" + ((org.vvv.baseapplet.AnyClass)cmpt).getText());
                        }
                    }
                } catch(Exception ex) { zzz += ("\n\r" + ex + "\n\r");  }
            }
            if(cmpt instanceof java.awt.Container) zzz += ParseCont(i+1, (java.awt.Container)cmpt);
        }
        return zzz;
    }
}

А так мы это безобразие вызываем:
Код
<HTML>
<HEAD>
  <TITLE>TestGUI</TITLE>
  <STYLE type="text/css">
      body { margin-left:0px; margin-right:0px; margin-top:0px; margin-bottom:0px; }
  </STYLE>
</HEAD>
<BODY scroll="no">
<script language="JavaScript">

 // user configurable part starts here

 var pluginurl        = '';
 var scriptable     = 'true';
 var codebase        = '.';
 // user configurable part ends here
 
 // verify if Java Plugin as control in Internet Explorer or Java Plugin for Netscape or native JRE of browser must be used
 var jre = 'control';
 
 if(navigator.platform.indexOf("Mac") > -1)
   jre = 'native';
 else if (navigator.appName.indexOf("Netscape") != -1)
   jre = 'plugin';
 
 document.open(); 
 switch (jre)
 {
 case 'control':
    document.writeln('<OBJECT CLASSID  = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"                               ');
    document.writeln('    ID       = "TestGUI"                                                                    ');
    document.writeln('    WIDTH    = "100%"                                        ');
    document.writeln('    HEIGHT   = "95%"                                        ');
    document.writeln('    BORDER   = 0>                                            ');
    document.writeln('<PARAM NAME = "TYPE"           VALUE = "application/x-java-applet;jpi-version=1.5.0">        ');
    document.writeln('<PARAM NAME = "SCRIPTABLE"     VALUE = "', scriptable,'">                            ');
    document.writeln('<PARAM NAME = "code"           VALUE = "org.vvv.test.FalseApplet">                ');
    document.writeln('<PARAM NAME = "codebase"       VALUE = "', codebase,'">                        ');
    document.writeln('<PARAM NAME = "archive"        VALUE = "FalseStub.jar,OtherApplet2.jar">');
    document.writeln('                                                    ');
    document.writeln('This page requires a Sun Java Plugin 1.5 and a SAPGUI for Java to view.                    ');
    document.writeln('                                                    ');
    document.writeln('</OBJECT>                                                ');
    break;
 case 'plugin':
    document.writeln('<EMBED TYPE        = "application/x-java-applet;version=1.5"                    ');
    document.writeln('    ID             = "TestGUI"                                                                    ');
    document.writeln('    PLUGINURL      = "', pluginurl,'"                                    ');    
    document.writeln('    WIDTH          = "100%"                                    ');                                
    document.writeln('    HEIGHT         = "95%"                                    ');
    document.writeln('    ALIGN          = "BASELINE"                                        ');
    document.writeln('    code           = "org.vvv.test.FalseApplet"                                ');
    document.writeln('    codebase       = "', codebase,'"                                ');
    document.writeln('    archive        = "FalseStub.jar,OtherApplet2.jar"');
    document.writeln('    scriptable     = "', scriptable,'"                                    ');
    document.writeln(' <NOEMBED>                                            ');
    document.writeln(' </NOEMBED>                                            ');
    document.writeln(' </EMBED>                                                    ');
    break;
 case 'native':  
    document.writeln('<APPLET CODEBASE  = "', codebase,'"                                                           ');
    document.writeln('        ID        = "TestGUI"                                                                    ');
    document.writeln('        ARCHIVE   = "FalseStub.jar,OtherApplet2.jar"');
    document.writeln('        CODE      = "org.vvv.test.FalseApplet"                                               ');
    document.writeln('        WIDTH     = "100%"                                                                    ');
    document.writeln('        HEIGHT    = "95%">                                                                   ');
    document.writeln('<PARAM NAME = "SCRIPTABLE"     VALUE = "', scriptable, '">                                    ');
    document.writeln('</APPLET>                                                                                     ');
    break;
 }
 document.writeln('<input id="Button1" type="button" value="button"  onClick="ButtonClick();"/>');
 document.close();

 function ButtonClick() {
    document.getElementById("TestGUI").DoMyAction();
 }
</SCRIPT>
</BODY>
</HTML>

Эта модель работает как задумано...............
А при попытке наследования из тех библиотек - обломс.......... Правда эти два проекта не подписаны, а те подписаны, причем разными сигнатурами........

Добавлено через 9 минут
Цитата(batigoal @ 12.1.2008,  16:08)
Цитата(vvvictor @  12.1.2008,  16:09 Найти цитируемый пост)
Дело в том, что у меня тоже нет этих классов

Можно и не исходники, а просто либу или скомпилированный class-файл (с зависимостями, конечно).

Попробуй пройтись дебагом - может, у тебя просто два класса с именем AnyClass в системе? Проверь полное имя классов.

Дело в том, что я использую именно полные имена классов - чтоб лишних наложений не случилось
PM   Вверх
vvvictor
Дата 14.1.2008, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 7.3.2006

Репутация: нет
Всего: нет



Вобщем, незагадываючи, обошел таким способом:

Код
cmpt.getClass().getMethod("setText", new Class[] {String.class}).invoke(cmpt, new Object[] {"AnyText"});


Вообще, ткните, плиз носом в толковое описание с примерами по java.lang.reflection и java.beans.......................
Судя по анализам декомпиленных  текстов - надо копать где-то там..............
PM   Вверх
w1nd
Дата 14.1.2008, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



vvvictor, а приведите сюда два числа. В исходнике из первого сообщения, добавьте такой вывод:
Код
// Вставка
System.out.println(System.identityHashCode(cmpt.getClass()));
System.out.println(System.identityHashCode(AnyClass.class));

// Дальше ваш код
if (cmpt instanceof AnyClass) {
    zzz += ("\n\r" + (AnyClass)cmpt.getText());
}



--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
vvvictor
Дата 14.1.2008, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 7.3.2006

Репутация: нет
Всего: нет



Цитата(w1nd @ 14.1.2008,  07:12)
vvvictor, а приведите сюда два числа. В исходнике из первого сообщения, добавьте такой вывод:
Код
// Вставка
System.out.println(System.identityHashCode(cmpt.getClass()));
System.out.println(System.identityHashCode(AnyClass.class));

Код
11724626
23708568

PM   Вверх
w1nd
Дата 14.1.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Что и требовалось доказать smile Ваш AnyClass, доступный в приведённом коде и тот, объектом которого является cmpt, если и являются одним и тем же классом, то загружены разными загрузчиками классов - иной причины на существование двух экземпляров java.lang.Class для одного класса нет.



Это сообщение отредактировал(а) w1nd - 14.1.2008, 09:36


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1439 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.