Module java.desktop
Package java.beans

Class Encoder

java.lang.Object
java.beans.Encoder
直接已知的子类:
XMLEncoder

public class Encoder extends Object
一个编码器是一个可以用来创建文件或流的类,它根据它们的公共API来编码一组JavaBeans的状态。 编码器与其持久性代理一起,负责将对象图拆分为一系列语句表达式,这些语句和表达式可以用来创建它。子类通常使用一些人类可读的形式(如Java源代码或XML)为这些表达式提供语法。
自:
1.4
  • Constructor Details

    • Encoder

      public Encoder()
      构造一个编码器
  • Method Details

    • writeObject

      protected void writeObject(Object o)
      将指定的对象写入输出流。序列化形式将表示一系列表达式,其组合效果将在读取输入流时创建一个等效对象。默认情况下,假定对象是具有无参数构造函数的JavaBean,其状态由Introspector返回的匹配的“setter”和“getter”方法对定义。
      参数:
      o - 要写入流的对象。
      参见:
    • setExceptionListener

      public void setExceptionListener(ExceptionListener exceptionListener)
      将此流的异常处理程序设置为exceptionListener。当此流捕获可恢复异常时,将通知异常处理程序。
      参数:
      exceptionListener - 此流的异常处理程序;如果为null,将使用默认异常侦听器。
      参见:
    • getExceptionListener

      public ExceptionListener getExceptionListener()
      获取此流的异常处理程序。
      返回:
      此流的异常处理程序;如果未明确设置,则将返回默认异常侦听器。
      参见:
    • getPersistenceDelegate

      public PersistenceDelegate getPersistenceDelegate(Class<?> type)
      返回给定类型的持久性代理。持久性代理通过按顺序应用以下规则来计算:
      1. 如果使用setPersistenceDelegate(java.lang.Class<?>, java.beans.PersistenceDelegate)方法将持久性代理与给定类型关联,则返回它。
      2. 然后,通过由给定类型的完全限定名称和“PersistenceDelegate”后缀组成的名称查找持久性代理。例如,Bean类的持久性代理应命名为BeanPersistenceDelegate,并位于相同的包中。
         public class Bean { ... }
         public class BeanPersistenceDelegate { ... }
        返回Bean类的BeanPersistenceDelegate类的实例。
      3. 如果类型为null,则返回一个编码null值的共享内部持久性代理。
      4. 如果类型是enum声明,则返回一个共享内部持久性代理,该代理通过其名称对该枚举的常量进行编码。
      5. 如果类型是原始类型或相应的包装器,则返回一个共享内部持久性代理,该代理对给定类型的值进行编码。
      6. 如果类型是数组,则返回一个共享内部持久性代理,该代理对适当类型和长度的数组以及其每个元素进行编码,就好像它们是属性一样。
      7. 如果类型是代理,则返回一个共享内部持久性代理,该代理通过使用Proxy.newProxyInstance(java.lang.ClassLoader, java.lang.Class<?>[], java.lang.reflect.InvocationHandler)方法对代理实例进行编码。
      8. 如果此类型的BeanInfo具有由BeanDescriptor定义的“persistenceDelegate”属性,则返回此命名属性的值。
      9. 在所有其他情况下,返回默认持久性代理。默认持久性代理假定类型是一个JavaBean,这意味着它具有默认构造函数,并且其状态可以由Introspector类返回的“setter”和“getter”方法的匹配对来描述。默认构造函数是具有具有ConstructorProperties注释的最大参数数量的构造函数。如果没有构造函数具有ConstructorProperties注释,则将使用无参数构造函数(没有参数的构造函数)。例如,在以下代码片段中,将使用Foo类的无参数构造函数,而将使用Bar类的两个参数构造函数。
         public class Foo {
             public Foo() { ... }
             public Foo(int x) { ... }
         }
         public class Bar {
             public Bar() { ... }
             @ConstructorProperties({"x"})
             public Bar(int x) { ... }
             @ConstructorProperties({"x", "y"})
             public Bar(int x, int y) { ... }
         }
      参数:
      type - 对象的类
      返回:
      给定类型的持久性代理
      参见:
    • setPersistenceDelegate

      public void setPersistenceDelegate(Class<?> type, PersistenceDelegate delegate)
      将指定的持久性代理与给定类型关联。
      参数:
      type - 指定的持久性代理适用于的对象类
      delegate - 给定类型的实例的持久性代理
      参见:
    • remove

      public Object remove(Object oldInstance)
      删除此实例的条目,返回旧条目。
      参数:
      oldInstance - 应该被删除的条目。
      返回:
      被删除的条目。
      参见:
    • get

      public Object get(Object oldInstance)
      在此流创建的环境中为oldInstance返回一个临时值。持久性代理可以使用其mutatesTo方法来确定此值是否可以初始化以形成等效对象输出,或者是否必须重新实例化新对象。如果流尚未看到此值,则返回null。
      参数:
      oldInstance - 要查找的实例。
      返回:
      对象,如果尚未看到对象,则为null。
    • writeStatement

      public void writeStatement(Statement oldStm)
      将语句oldStm写入流。 oldStm应完全根据调用者的环境编写,即目标和所有参数应是正在写入的对象图的一部分。这些表达式代表一系列“发生了什么”表达式,告诉输出流如何生成类似原始对象的对象图。

      此方法的实现将生成第二个表达式,以表示在读取流时将存在的相同表达式的环境。这只需在目标和所有参数上调用writeObject并使用结果构建新表达式即可实现。

      参数:
      oldStm - 要写入流的表达式。
    • writeExpression

      public void writeExpression(Expression oldExp)
      实现首先检查是否已经写入具有此值的表达式。如果没有,则克隆表达式,使用与writeStatement相同的过程,并通过调用writeObject将此表达式的值与克隆表达式的值协调。
      参数:
      oldExp - 要写入流的表达式。