Этот совет Java иллюстрирует метод десериализовать боб с XML. Для разработчика информацию, когда экземпляр Bean имеет серийные номера, оно преобразуется в поток данных и записывается в памяти. Любое апплетов, приложений или инструментом, который использует эту Bean могут "воссоздать" его десериализации.


    // Deserialize an object

    try {

    

        XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(

            new FileInputStream("infilename.xml")));

    

        MyClass obj = (MyClass)decoder.readObject();

        decoder.close();

    

        // Use the object

        int property = obj.getProp();     // 1

        int[] properties = obj.getProps()// [1, 2, 3]

        

    catch (FileNotFoundException e) {

    }

Здесь XML-данных, десериализованы:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.4.0" class="java.beans.XMLDecoder">
<object class="MyClass">
<void property="prop">
<int>1</int>
</void>
<void property="props">
<array class="int" length="3">
<void index="0">
<int>1</int>
</void>
<void index="1">
<int>2</int>
</void>
<void index="2">
<int>3</int>
</void>
</array>
</void>
</object>
</java>

Этот совет Java демонстрирует метод перечисления имен тех или иных свойств компонентов. Свойств компонента являются учреждениями, которые участвуют в процессе отображения. Они, как правило, на полях данным компонентом. Однако, это не является обязательным требованием поскольку получить


    try {

    

        BeanInfo bi = Introspector.getBeanInfo(MyBean.class);

        PropertyDescriptor[] pds = bi.getPropertyDescriptors();

        

        for (int i=0; i<pds.length; i++) {

            // Get property name

            String propName = pds[i].getName();

        }

        

        // class, prop1, prop2, PROP3

        

    catch (java.beans.IntrospectionException e) {

    }

    

    public class MyBean {

        

        // Property prop1        

        public String getProp1() {

            return null;

        }

        

        public void setProp1(String s) {

        }

    

        // Property prop2

        public int getProp2() {

            return 0;

        }

        

        public void setProp2(int i) {

        }

    

        // Property PROP

        public byte[] getPROP3() {

            return null;

        }

        

        public void setPROP3(byte[] bytes) {

        }

    }

Этот совет Java иллюстрирует методы получения и установки свойств Bean. Этот совет использует слова и заявления для установления свойств. Разработчик может приобрести и установить три типа свойств объекта, примитивный тип, и массива. Оба этих классов использовать имя метода, который получает или устанавливает собственности.


    Object obj = new MyBean();

    try {

    

        // Developer may get the value of prop1

        Expression expr = new Expression(obj, "getProp1"

          new Object[0]);



        expr.execute();

        String s = (String)expr.getValue();

    

        // Developer may set the value of prop1

        Statement stmt = new Statement(obj, "setProp1"

          new Object[]{"new string"});



        stmt.execute();

    

        // Now developer may get the value of prop2

        expr = new Expression(obj, "getProp2"new Object[0]);

        expr.execute();

        int i = ((Integer)expr.getValue()).intValue();

    

        // Now developer may set the value of prop2

        stmt = new Statement(obj, "setProp2"

          new Object[]{new Integer(123)});

        stmt.execute();

    

        // Further get the value of prop1

        expr = new Expression(obj, "getProp3"new Object[0]);

        expr.execute();

        byte[] bytes = (byte[])expr.getValue();

    

        // Finally setting the value of prop1

        stmt = new Statement(obj, "setProp3"

          new Object[]{new byte[]{0x120x23}});

        stmt.execute();

        

    catch (Exception e) {

    }

    

    public class MyBean {

    

        // Property prop1

        String prop1;

        

        public String getProp1() {

            return prop1;

        }

        

        public void setProp1(String s) {

            prop1 = s;

        }

    

        // Property prop2

        int prop2;

        

        public int getProp2() {

            return prop2;

        }

        

        public void setProp2(int i) {

            prop2 = i;

        }

    

        // Property prop3

        byte[] prop3;

        

        public byte[] getProp3() {

            return prop3;

        }

        

        public void setProp3(byte[] bytes) {

            prop3 = bytes;

        }

    }

Этот совет Java демонстрирует методы сериализации бобов до XML. Bean сохраняется Имея свои свойства, области, а также информация о состоянии сохраняются и восстанавливаются и из памяти. Механизм, который делает возможным сохранение называется сериализации. JavaBeans использует сериализация объекта JDK's API для своих нужд сериализации.


    // Create an object and set properties

    MyClass obj = new MyClass();

    obj.setProp(1);

    obj.setProps(new int[]{123});

    

    try {



        // Serialize object into XML

        XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(

            new FileOutputStream("outfilename.xml")));

        encoder.writeObject(o);

        encoder.close();



    catch (FileNotFoundException e) {

    }



    // This class defines two properties - prop and props

    public class MyClass {



        // The prop property

        int i;

        public int getProp() {

            return i;

        }

        public void setProp(int i) {

            this.i = i;

        }

    

        // The props property

        int[] iarray = new int[0];



        public int[] getProps() {

            return iarray;

        }

        public void setProps(int[] iarray) {

            this.iarray = iarray;

        }

    }

Здесь XML-данных:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.4.0" class="java.beans.XMLDecoder">
<object class="MyClass">
<void property="prop">
<int>1</int>
</void>
<void property="props">
<array class="int" length="3">
<void index="0">
<int>1</int>
</void>
<void index="1">
<int>2</int>
</void>
<void index="2">
<int>3</int>
</void>
</array>
</void>
</object>
</java>

В J2SE 5.0, ряд функций были добавлены. Одна из них была поддержка IndexedPropertyChangeEvent. Компонент JavaBeans API обеспечила возможность сообщать об изменениях в регулярных свойств компонента JavaBeans (также называемого JavaBean или просто "боб"). Поддержка IndexedPropertyChangeEvent Добавлена возможность сообщить дополнительную информацию об изменениях в индексированных свойств компонентов.

Большинство людей знакомы с JavaBean свойствам компонентов. Просто добавьте установить и получить методы вашего класса и у вас есть для чтения и записи имущества определяется независимо от названия это после установки и получите. Иными словами, если ваш класс имеет методы именем SETNAME () и GetName (), в вашем классе JavaBean имущества компонента именем имя.

Есть два типа свойств компонентов: регулярные и проиндексированы. Индексированные свойства отличаются от регулярных свойств в том, что они имеют несколько значений, где каждое значение имеет доступ к индексу. Установить и получить методы регулярной собственности, таких как имя будет выглядеть следующим образом:

Регулярный собственности:

  • public void setName(String name)
  • public String getName()

Если имя индексироваться собственности, методы, выглядят следующим образом:

Индексированные собственности:

  • public void setName(int index, String name)
  • public String getName(int index)
  • public void setName(String[] names)
  • public String[] getName()

Фасоль может быть разработана для уведомления Вас о своих изменениях собственности. Вы можете зарегистрировать объект PropertyChangeListener с фасоль через addPropertyChangeListener () метод. Слушатель затем уведомил об изменениях через PropertyChangeEvent IndexedPropertyChangeEvent объекты или объекты. Собственности, которая генерирует PropertyChangeEvent когда ее изменения величина называется связанным собственности.

Класс PropertyChangeListener имеет один метод:

public void propertyChange(PropertyChangeEvent pce)

Если аргумент PropertyChange () имеет тип PropertyChangeEvent, как вы получите уведомление с IndexedPropertyChangeEvent? Ответ вытекает из того факта, что класс IndexedPropertyChangeEvent является подклассом PropertyChangeEvent. Таким образом, внутри вашего PropertyChange () вам потребуется экземпляром проверить, какой тип аргумента вы получаете:


   public void propertyChange(PropertyChangeEvent pce) {

     String name = pce.getPropertyName();

     if (pce instanceof IndexedPropertyChangeEvent) {

       IndexedPropertyChangeEvent ipce =

         (IndexedPropertyChangeEventpce;

       int index = ipce.getIndex();

       System.out.println("Property: " + name + "; index: " 

       + index);

     else {

       System.out.println("Property: " + name);

     }

     System.out.println("; value: " + pce.getNewValue());

   }

Перед просмотром пример программы, которая использует IndexedPropertyChangeEvent, давайте сосредоточимся на том, как сообщить об изменении связанной индексироваться собственности. Следующий код докладов обновления имя индексироваться собственности показано ранее:


   private PropertyChangeSupport changeSupport;



   public ClassConstructor() {

     changeSupport = new PropertyChangeSupport(this);

   }



   public void setName(int index, String name) {

     String oldName = this.name;

     this.name = name;

     changeSupport.fireIndexedPropertyChange("name", index,

       oldName, name);

   }

PropertyChangeSupport класс поддержки класс найден в пакете java.beans (пакет для компонента JavaBeans API). FireIndexedPropertyChange () методом докладов изменения связаны индексироваться собственности (в данном случае, название), на любую слушателей, которые были зарегистрированы через addPropertyChangeListener () метод.

Вот что полный пример выглядит следующим образом:


   import java.beans.*;

   import java.util.*;

   

   public class IndexedSampleBean {

   

     private PropertyChangeSupport changeSupport;

   

     private Map<Integer, String> names;

   

     private String title;

   

     public IndexedSampleBean() {

       changeSupport = new PropertyChangeSupport(this);

       names = new HashMap<Integer, String>();

     }

   

     public void setTitle(String title) {

       String oldTitle = this.title;

       this.title = title;

       changeSupport.firePropertyChange("title", oldTitle, title);

     }

   

     public String getTitle() {

       return title;

     }

   

     public void setName(int index, String name) {

         String oldName = names.get(index);

         names.put(index, name);

         changeSupport.fireIndexedPropertyChange("name", index,

                   oldName, name);

     }

   

     public String getName(int index) {

       return names.get(index);

     }

   

     public void addPropertyChangeListener(

      PropertyChangeListener l) {

         changeSupport.addPropertyChangeListener(l);

     }



     public void removePropertyChangeListener(

      PropertyChangeListener l) {

         changeSupport.removePropertyChangeListener(l);

     }

   

     public static void main(String[] argsthrows Exception {

       IndexedSampleBean bean = new IndexedSampleBean();

       PropertyChangeListener listener = 

         new PropertyChangeListener() {

           public void propertyChange(PropertyChangeEvent pce) {

             String name = pce.getPropertyName();

             if (pce instanceof IndexedPropertyChangeEvent) {

               IndexedPropertyChangeEvent ipce =

                 (IndexedPropertyChangeEventpce;

               int index = ipce.getIndex();

               System.out.print("Property: " + name +

                 "; index: " + index);

             else {

               System.out.print("Property: " + name);

             }

             System.out.println("; value: " + pce.getNewValue());

           }

       };

       bean.addPropertyChangeListener(listener);

       bean.setName(1"John");

       bean.setName(2"Ed");

       bean.setName(3"Mary");

       bean.setName(4"Joan");

       bean.setTitle("Captain");

       System.out.println("Name at 3 is: " + bean.getName(3));

       System.out.println("Title is: " + bean.getTitle());

     }

   }

Класс определяет индексированные свойства имя и устанавливает имя на четырех позициях. Кроме того, регулярно связаны свойства названии присутствует также и множество. Слушатель уведомили для каждого вызова установить имя или название, а затем напечатать имя свойства, индекс (если необходимо), и стоимость. Затем класс получает имя на одну конкретную позицию и печатает его, перед печатью одного названия.

Запуск программы дает следующие результаты:

>java IndexedSample
Property: name index: 1 value: John
Property: name index: 2 value: Ed
Property: name index: 3 value: Mary
Property: name index: 4 value: Joan
Property: title; value: Captain
Name at 3 is: Mary
Title is: Captain

Для получения дополнительной информации о поддержке IndexedPropertyChangeEvent в компоненте JavaBeans API, см.. Также см. в Java Tutorial.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.