/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.ahat.heapdump; import com.android.tools.perflib.heap.ClassObj; import com.android.tools.perflib.heap.Field; import com.android.tools.perflib.heap.Instance; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; public class AhatClassObj extends AhatInstance { private String mClassName; private AhatClassObj mSuperClassObj; private AhatInstance mClassLoader; private FieldValue[] mStaticFieldValues; public AhatClassObj(long id) { super(id); } @Override void initialize(AhatSnapshot snapshot, Instance inst) { super.initialize(snapshot, inst); ClassObj classObj = (ClassObj)inst; mClassName = classObj.getClassName(); ClassObj superClassObj = classObj.getSuperClassObj(); if (superClassObj != null) { mSuperClassObj = snapshot.findClassObj(superClassObj.getId()); } Instance loader = classObj.getClassLoader(); if (loader != null) { mClassLoader = snapshot.findInstance(loader.getId()); } Collection<Map.Entry<Field, Object>> fieldValues = classObj.getStaticFieldValues().entrySet(); mStaticFieldValues = new FieldValue[fieldValues.size()]; int index = 0; for (Map.Entry<Field, Object> field : fieldValues) { String name = field.getKey().getName(); String type = field.getKey().getType().toString(); Value value = snapshot.getValue(field.getValue()); mStaticFieldValues[index++] = new FieldValue(name, type, value); if (field.getValue() instanceof Instance) { Instance ref = (Instance)field.getValue(); if (ref.getNextInstanceToGcRoot() == inst) { value.asAhatInstance().setNextInstanceToGcRoot(this, "." + name); } } } } /** * Returns the name of the class this is a class object for. */ public String getName() { return mClassName; } /** * Returns the superclass of this class object. */ public AhatClassObj getSuperClassObj() { return mSuperClassObj; } /** * Returns the class loader of this class object. */ public AhatInstance getClassLoader() { return mClassLoader; } /** * Returns the static field values for this class object. */ public List<FieldValue> getStaticFieldValues() { return Arrays.asList(mStaticFieldValues); } @Override public boolean isClassObj() { return true; } @Override public AhatClassObj asClassObj() { return this; } @Override public String toString() { return mClassName; } @Override AhatInstance newPlaceHolderInstance() { return new AhatPlaceHolderClassObj(this); } }