171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom/*
271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * Licensed to the Apache Software Foundation (ASF) under one or more
371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * contributor license agreements.  See the NOTICE file distributed with
471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * this work for additional information regarding copyright ownership.
571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * The ASF licenses this file to You under the Apache License, Version 2.0
671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * (the "License"); you may not use this file except in compliance with
771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * the License.  You may obtain a copy of the License at
871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom *
971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom *     http://www.apache.org/licenses/LICENSE-2.0
1071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom *
1171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * Unless required by applicable law or agreed to in writing, software
1271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS,
1371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * See the License for the specific language governing permissions and
1571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * limitations under the License.
1671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom */
1771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom/*
1871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * Copyright (C) 2008 The Android Open Source Project
1971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom *
2071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License");
2171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * you may not use this file except in compliance with the License.
2271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * You may obtain a copy of the License at
2371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom *
2471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom *      http://www.apache.org/licenses/LICENSE-2.0
2571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom *
2671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * Unless required by applicable law or agreed to in writing, software
2771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS,
2871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * See the License for the specific language governing permissions and
3071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * limitations under the License.
3171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom */
3271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
3371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrompackage java.lang.reflect;
3471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
3571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstromimport com.android.dex.Dex;
3671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
3771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom/**
3871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom * @hide
3971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom */
4071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrompublic final class ArtField {
4171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
4271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    private Class<?> declaringClass;
4371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    /** Field access flags (modifiers) */
4471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    private int accessFlags;
4571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    /** Index into DexFile's field ids */
4671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    private int fieldDexIndex;
4771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    /** Offset of field in object or class */
4871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    private int offset;
4971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
5071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    /**
5171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom     * Only created by art directly.
5271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom     */
5371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    private ArtField() {}
5471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
5571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    public int getAccessFlags() {
5671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        return accessFlags;
5771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    }
5871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
5971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    int getDexFieldIndex() {
6071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        return fieldDexIndex;
6171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    }
6271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
6371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    int getOffset() {
6471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        return offset;
6571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    }
6671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
6771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    public String getName() {
6871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        if (fieldDexIndex == -1) {
6971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom            // Proxy classes have 1 synthesized static field with no valid dex index
7071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom            if (!declaringClass.isProxy()) {
7171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom                throw new AssertionError();
7271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom            }
7371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom            return "throws";
7471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        }
7571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        Dex dex = declaringClass.getDex();
7671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        int nameIndex = dex.nameIndexFromFieldIndex(fieldDexIndex);
7771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        return declaringClass.getDexCacheString(dex, nameIndex);
7871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    }
7971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
8071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    Class<?> getDeclaringClass() {
8171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        return declaringClass;
8271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    }
8371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom
8471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    Class<?> getType() {
8571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        if (fieldDexIndex == -1) {
8671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom            // The type of the synthesized field in a Proxy class is Class[][]
8771dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom            if (!declaringClass.isProxy()) {
8871dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom                throw new AssertionError();
8971dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom            }
9071dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom            return Class[][].class;
9171dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        }
9271dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        Dex dex = declaringClass.getDex();
9371dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        int typeIndex = dex.typeIndexFromFieldIndex(fieldDexIndex);
9471dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom        return declaringClass.getDexCacheType(dex, typeIndex);
9571dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom    }
9671dc4f7d4829335f7aba5414b43d16cd316ba22fBrian Carlstrom}
97