1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.lang.reflect;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.annotation.Annotation;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Hashtable;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.kernel.vm.StringUtils;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.kernel.vm.ReflectionAccess;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code AccessibleObject} is the superclass of all member reflection classes
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (Field, Constructor, Method). AccessibleObject provides the ability to toggle
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a flag controlling access checks for these objects. By default, accessing a
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * member (for example, setting a field or invoking a method) checks the
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * validity of the access (for example, invoking a private method from outside
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the defining class is prohibited) and throws IllegalAccessException if the
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * operation is not permitted. If the accessible flag is set to true, these
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * checks are omitted. This allows privileged code, such as Java object
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * serialization, object inspectors, and debuggers to have complete access to
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * objects.
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Field
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Constructor
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Method
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see ReflectPermission
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class AccessibleObject implements AnnotatedElement {
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // If true, object is accessible, bypassing normal security checks
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    boolean flag = false;
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * one dimensional array
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String DIMENSION_1 = "[]";
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * two dimensional array
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String DIMENSION_2 = "[][]";
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * three dimensional array
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String DIMENSION_3 = "[][][]";
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Holds a mapping from Java type names to native type codes.
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static Hashtable<String, String> trans;
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans = new Hashtable<String, String>(9);
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("byte", "B");
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("char", "C");
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("short", "S");
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("int", "I");
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("long", "J");
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("float", "F");
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("double", "D");
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("void", "V");
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        trans.put("boolean", "Z");
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Attempts to set the value of the accessible flag for all the objects in
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the array provided. Only one security check is performed. Setting this
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * flag to {@code false} will enable access checks, setting to {@code true}
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * will disable them. If there is a security manager, checkPermission is
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * called with a {@code ReflectPermission("suppressAccessChecks")}.
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param objects
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the accessible objects
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param flag
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value for the accessible flag
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws SecurityException
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the request is denied
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #setAccessible(boolean)
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see ReflectPermission
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void setAccessible(AccessibleObject[] objects, boolean flag)
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws SecurityException {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecurityManager smgr = System.getSecurityManager();
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (smgr != null) {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            smgr.checkPermission(new ReflectPermission("suppressAccessChecks"));
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        synchronized(AccessibleObject.class) {
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < objects.length; i++) {
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                objects[i].flag = flag;
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new {@code AccessibleObject} instance. {@code
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * AccessibleObject} instances can only be constructed by the virtual
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * machine.
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected AccessibleObject() {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super();
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Indicates whether this object is accessible without security checks being
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * performed. Returns the accessible flag.
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this object is accessible without security
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         checks, {@code false} otherwise
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isAccessible() {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return flag;
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Attempts to set the value of the accessible flag. Setting this flag to
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code false} will enable access checks, setting to {@code true} will
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * disable them. If there is a security manager, checkPermission is called
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * with a {@code ReflectPermission("suppressAccessChecks")}.
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param flag
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value for the accessible flag
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws SecurityException
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the request is denied
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see ReflectPermission
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setAccessible(boolean flag) throws SecurityException {
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecurityManager smgr = System.getSecurityManager();
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (smgr != null) {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            smgr.checkPermission(new ReflectPermission("suppressAccessChecks"));
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.flag = flag;
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the accessible flag on this instance without doing any checks.
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param flag
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value for the accessible flag
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*package*/ void setAccessibleNoCheck(boolean flag) {
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.flag = flag;
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getAnnotation(annotationType) != null;
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Annotation[] getDeclaredAnnotations() {
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new RuntimeException("subclass must override this method");
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Annotation[] getAnnotations() {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // for all but Class, getAnnotations == getDeclaredAnnotations
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getDeclaredAnnotations();
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* slow, but works for all sub-classes */
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (annotationType == null) {
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation[] annos = getAnnotations();
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = annos.length-1; i >= 0; --i) {
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (annos[i].annotationType() == annotationType) {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return (T) annos[i];
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the signature for a class. This is the kind of signature used
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * internally by the JVM, with one-character codes representing the basic
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * types. It is not suitable for printing.
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param clazz
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the class for which a signature is required
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The signature as a string
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String getSignature(Class<?> clazz) {
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String result = "";
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String nextType = clazz.getName();
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if(trans.containsKey(nextType)) {
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            result = trans.get(nextType);
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if(clazz.isArray()) {
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                result = "[" + getSignature(clazz.getComponentType());
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                result = "L" + nextType + ";";
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a printable String consisting of the canonical names of the
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * classes contained in an array. The form is that used in parameter and
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * exception lists, that is, the class or type names are separated by
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * commas.
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param types
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the array of classes
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The String of names
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String toString(Class<?>[] types) {
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder result = new StringBuilder();
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (types.length != 0) {
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            result.append(types[0].getCanonicalName());
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 1; i < types.length; i++) {
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                result.append(',');
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                result.append(types[i].getCanonicalName());
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toString();
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the Signature attribute for this instance. Returns {@code null}
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if not found.
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*package*/ String getSignatureAttribute() {
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: This method would have been declared abstract, but the
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * standard API lists this class as concrete.
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Retrieve the signature attribute from an arbitrary class.  This is
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the same as Class.getSignatureAttribute(), but it can be used from
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the java.lang.reflect package.
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*package*/ static String getClassSignatureAttribute(Class clazz) {
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object[] annotation = getClassSignatureAnnotation(clazz);
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (annotation == null) {
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return StringUtils.combineStrings(annotation);
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Retrieve the signature annotation from an arbitrary class.  This is
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the same as Class.getSignatureAttribute(), but it can be used from
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the java.lang.reflect package.
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static native Object[] getClassSignatureAnnotation(Class clazz);
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the unique instance of {@link ReflectionAccessImpl}.
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return non-null; the unique instance
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static /*package*/ ReflectionAccess getReflectionAccess() {
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ReflectionAccessImpl.THE_ONE;
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends the specified class name to the buffer. The class may represent
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a simple type, a reference type or an array type.
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sb buffer
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj the class which name should be appended to the buffer
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException if any of the arguments is null
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void appendArrayType(StringBuilder sb, Class<?> obj) {
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!obj.isArray()) {
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(obj.getName());
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int dimensions = 1;
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class simplified = obj.getComponentType();
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        obj = simplified;
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (simplified.isArray()) {
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            obj = simplified;
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            dimensions++;
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(obj.getName());
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        switch (dimensions) {
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        case 1:
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(DIMENSION_1);
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            break;
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        case 2:
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(DIMENSION_2);
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            break;
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        case 3:
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(DIMENSION_3);
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            break;
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        default:
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (; dimensions > 0; dimensions--) {
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(DIMENSION_1);
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends names of the specified array classes to the buffer. The array
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * elements may represent a simple type, a reference type or an array type.
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Output format: java.lang.Object[], java.io.File, void
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sb buffer
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param objs array of classes to print the names
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException if any of the arguments is null
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void appendArrayType(StringBuilder sb, Class[] objs) {
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (objs.length > 0) {
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            appendArrayType(sb, objs[0]);
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 1; i < objs.length; i++) {
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(',');
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                appendArrayType(sb, objs[i]);
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends names of the specified array classes to the buffer. The array
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * elements may represent a simple type, a reference type or an array type.
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Output format: java.lang.Object[], java.io.File, void
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sb buffer
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param objs array of classes to print the names
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException if any of the arguments is null
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void appendArrayGenericType(StringBuilder sb, Type[] objs) {
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (objs.length > 0) {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            appendGenericType(sb, objs[0]);
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 1; i < objs.length; i++) {
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(',');
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                appendGenericType(sb, objs[i]);
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends the generic type representation to the buffer.
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sb buffer
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj the generic type which representation should be appended to the buffer
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException if any of the arguments is null
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void appendGenericType(StringBuilder sb, Type obj) {
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj instanceof TypeVariable) {
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(((TypeVariable)obj).getName());
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (obj instanceof ParameterizedType) {
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(obj.toString());
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (obj instanceof GenericArrayType) { //XXX: is it a working branch?
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Type simplified = ((GenericArrayType)obj).getGenericComponentType();
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            appendGenericType(sb, simplified);
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append("[]");
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (obj instanceof Class) {
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class c = ((Class<?>)obj);
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (c.isArray()){
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String as[] = c.getName().split("\\[");
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int len = as.length-1;
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (as[len].length() > 1){
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append(as[len].substring(1, as[len].length()-1));
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    char ch = as[len].charAt(0);
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (ch == 'I')
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("int");
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (ch == 'B')
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("byte");
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (ch == 'J')
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("long");
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (ch == 'F')
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("float");
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (ch == 'D')
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("double");
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (ch == 'S')
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("short");
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (ch == 'C')
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("char");
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (ch == 'Z')
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("boolean");
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (ch == 'V') //XXX: is it a working branch?
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sb.append("void");
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (int i = 0; i < len; i++){
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append("[]");
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(c.getName());
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Appends names of the specified array classes to the buffer. The array
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * elements may represent a simple type, a reference type or an array type.
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * In case if the specified array element represents an array type its
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * internal will be appended to the buffer.
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Output format: [Ljava.lang.Object;, java.io.File, void
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sb buffer
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param objs array of classes to print the names
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException if any of the arguments is null
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void appendSimpleType(StringBuilder sb, Class<?>[] objs) {
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (objs.length > 0) {
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(objs[0].getName());
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 1; i < objs.length; i++) {
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(',');
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(objs[i].getName());
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
466