一些背景知识,以什么我想要实现:有效地名称访问域
我解析JSON(超过15GB),我必须将它存储在内存中,所以任何包装和额外的数据不欢迎,由于其中使用的框架和接口,我必须提供按名称访问字段的功能。通过用Enum替换一些String,用int替换Integer,用Double替换Double等,我能够削减大约90%的内存占用(与Jackson相比)。
我正在寻找在运行时以Java名义高效地访问字段。我意识到反思,但对我的情况来说,它的表现简直无法接受,所以我不想使用它。
如果它使得问题更容易解决,我不会太麻烦设置字段值。我也在编译时知道支持的字段的名称。
由于盒装对象的内存占用,我不想在地图中存储所有内容,但我不介意以盒装形式返回它们。
我确定他人遇到了这个问题,我对任何聪明的解决方案都感兴趣 - 比如果... else ...语句更聪明。
假设实现该接口是:
public interface Accessor {
Object get(String fieldName);
}
的Object
由get返回可以是任何类型,包括枚举。一个天真的实现将是:
public class TestObject implements Accessor {
public enum MyEnum {ONE, TWO, THREE};
private final MyEnum myEnum;
private final int myInt;
private final double myDouble;
private final String myString;
public TestObject(MyEnum myEnum, int myInt, double myDouble, String myString) {
this.myEnum = myEnum;
this.myInt = myInt;
this.myDouble = myDouble;
this.myString = myString;
}
@Override
public Object get(String fieldName) {
if ("myEnum".equals(fieldName)) {
return myEnum;
} else if ("myInt".equals(fieldName)) {
return myInt;
} else if ("myDouble".equals(fieldName)) {
return myDouble;
} else if ("myString".equals(fieldName)) {
return myString;
} else {
throw new UnsupportedOperationException(); // Or could simply return null
}
}
}
你想要动态访问字段,而不反射?你不能把这些值放到带有字段名称键的映射中,它必须访问一个对象?在运行时生成代码/字节码怎么样?除此之外,我不清楚你认为选择是什么。 – 2012-07-30 21:51:43
什么是底层对象? – maasg 2012-07-30 21:57:01
感谢您的问题。通过提供有关该问题的更多信息来回答他们。 – Artur 2012-07-30 22:13:49