为什么静态和瞬态成员不能从Java类中获取Avro InduceSchemaTool?

时间:2014-10-02 00:17:51

标签: java reflection schema avro

我正在尝试从Java Class层次结构创建一个avro架构。 在我深入研究完整结构之前,我试图为一个简单的java类生成一个Avro模式,如下所示

package TestAvroTools;

import java.util.ArrayList;

public  class  InduceSchemaIPClass {

    private int inta;
    private String stringb;
    private ArrayList<String> a = null;
    private boolean booleana;

    private static class InnerKlass{
        int innerKlassInta;

    }

}

Avro InduceScehmaTool(org.apache.avro.tool)(avro v1.7.7)(jdk 1.6)跳过静态类成员InnerKclass。 输出如下:

{
  "type" : "record",
  "name" : "InduceSchemaIPClass",
  "namespace" : "test.avro.ip",
  "fields" : [ {
    "name" : "inta",
    "type" : "int"
  }, {
    "name" : "stringb",
    "type" : "string"
  }, {
    "name" : "a",
    "type" : {
      "type" : "array",
      "items" : "string",
      "java-class" : "java.util.ArrayList"
    }
  }, {
    "name" : "booleana",
    "type" : "boolean"
  } ]
}

我调试了代码以找到在ReflectData的getFields()(org.apache.avro.reflect)中跳过此内容的语句

for (Field field : c.getDeclaredFields())
        if ((field.getModifiers() & (Modifier.TRANSIENT|Modifier.STATIC)) == 0)

有没有理由这么做?我需要静态成员作为Avro生成模式的一部分。

1 个答案:

答案 0 :(得分:0)

从我在Apache Avro主页上看到的内容:“Apache Avro™是一个数据序列化系统。”。

现在,让我们打开JLS 8.3.1.3。 transient字段:“变量可能标记为瞬态,表示它们不属于对象的持久状态。”

静态的故事。

ReflectData源代码声明如下:“返回此类及其超类序列化。”

所以,答案是:它们不是对象持久状态的一部分,因此没有必要在模式中包含这些字段(从工具的角度来看)。