为什么静态和瞬态成员不能从Java类获取Avro Schematool?
我试图从Java类层次结构创建一个avro模式。 在深入研究完整的结构之前,我尝试为一个简单的java类生成一个Avro模式,如下所示为什么静态和瞬态成员不能从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
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)