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

为什么静态和瞬态成员不能从Java类获取Avro Schematool?,java,reflection,schema,avro,Java,Reflection,Schema,Avro,我试图从Java类层次结构创建一个avro模式。 在深入研究完整的结构之前,我尝试为一个简单的java类生成一个Avro模式,如下所示 package TestAvroTools; import java.util.ArrayList; public class InduceSchemaIPClass { private int inta; private String stringb; private ArrayList<String> a = n

我试图从Java类层次结构创建一个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;

    }

}
我调试了代码,在ReflectData的getFields()中找到了跳过这一点的语句(org.apache.avro.reflect)


这样做有什么原因吗?我需要静态成员成为Avro生成模式的一部分。

我可以在apacheavro主页上看到:“apacheavro™ 是一个数据序列化系统。“

现在,让我们打开JLS 8.3.1.3。瞬态字段:“变量可能被标记为瞬态,以表明它们不是对象持久状态的一部分。”

静力学也是如此

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


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

感谢@Ivan的解释。我现在明白了,因为瞬态和静态不是对象持久状态的一部分,所以工具会跳过它们。我没有领会:的意义,ReflectData源代码声明如下:“返回这个类及其要序列化的超类。”当它说返回这个类时,我理解它指的是所有成员。该语句是否内在地指定了要以某种方式跳过的瞬态和静态字段?我想从序列化的角度来看,所有重要的字段都是如此。
{
  "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"
  } ]
}
for (Field field : c.getDeclaredFields())
        if ((field.getModifiers() & (Modifier.TRANSIENT|Modifier.STATIC)) == 0)