我想获得用java.reflection构建的对象的大小。 这是代码。 我不明白我做错了什么。 当我得到对象时,我试图使用仪器界面,但它不起作用。 谢谢你的帮助!
public String analayzeData(Object obj) throws IllegalArgumentException, IllegalAccessException{
Class c = obj.getClass();
System.out.println(sizer.getObjectSize(obj));
String dataText="*************Start of " + c.getSimpleName() + " Class*************\n";
Class superclass = c.getSuperclass();
if(superclass!=null && !superclass.isAssignableFrom(Object.class)){
Field[] superField = superclass.getDeclaredFields();
for(Field field : superField){
field.setAccessible(true);
Object fieldVal = field.get(obj);
dataText+=field.getName() + " = " + fieldVal + "\n";
}
}
// Instrumentation objectSizes =null;
Field[] fieldType= c.getDeclaredFields();
for(Field field : fieldType){
field.setAccessible(true);
dataText+=field.getName() + ":";
Object fieldVal = field.get(obj);
if(fieldVal instanceof ArrayList){
ArrayList<?> arrayListField = (ArrayList<?>)fieldVal;
dataText+="Size of " + field.getName() +" ArrayList = " + arrayListField.size() + "\n";
for (int i=0; i < arrayListField.size();i++){
dataText+=analayzeData(arrayListField.get(i));
}
dataText+="****End of " + field.getName() + "List****\n";
}
else
dataText+= " = " + fieldVal+"\n";
}
dataText+="*************End of " + c.getSimpleName() + " Class*************\n";
return dataText ;
}
}
class sizer{
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}
答案 0 :(得分:0)
不确定我是否正确理解了您的问题,但我想您想知道为什么您打印的对象的大小(几乎)总是相同的。使用analyzeData
方法的几个示例:
analayzeData("123456789123456789123456789"); // will print a size of 16
analayzeData("123456789"); // will also print a size of 16
analayzeData(new BigInteger("1")) // will print a size of 32!
analayzeData(Arrays.asList(1, 2, 3, 4, 5)); // will print a size of 16
这些反直觉结果的原因是Instrumentation.getObjectSize(Object)
返回对象本身的(估计)大小和不对象的大小加上它的所有成员/领域。
因此对于包含1000个元素的ArrayList
,结果仍然是 16 ,因为这是ArrayList
的大小 - 它的成员大小必须是单独计算。
修改
以下是有关如何使用工具with maven和with ant
的一些教程