Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > (AnyClass)java.awt.Component


Автор: vvvictor 11.1.2008, 22:01
Доброе время суток.
Код
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 

Автор: nornad 11.1.2008, 22:37
Почему-то мне кажется, что здесь
Код

(AnyClass)cmpt.getText()

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

((AnyClass)cmpt).getText()

Автор: vvvictor 11.1.2008, 22:43
nornad, Делал - не пролазит...........

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

Автор: w1nd 11.1.2008, 22:51
Разные классы? Разные загрузчики?

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

Автор: vvvictor 12.1.2008, 10:55
Код
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-странцы....................

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

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

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

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

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

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

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

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

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

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

Сейчас попробую еще промоделироваться на абстрактной ситуации...........  

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

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

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

Автор: vvvictor 12.1.2008, 16:29
Ничего не понимаю......... Промоделировал ситуацию:
Проект: 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 в системе? Проверь полное имя классов.

Дело в том, что я использую именно полные имена классов - чтоб лишних наложений не случилось

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

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


Вообще, ткните, плиз носом в толковое описание с примерами по java.lang.reflection и java.beans.......................
Судя по анализам декомпиленных  текстов - надо копать где-то там..............

Автор: w1nd 14.1.2008, 07:12
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());
}

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

Код
11724626
23708568

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)