1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 /*
18  * Copyright (C) 2006-2007 The Android Open Source Project
19  *
20  * Licensed under the Apache License, Version 2.0 (the "License");
21  * you may not use this file except in compliance with the License.
22  * You may obtain a copy of the License at
23  *
24  *      http://www.apache.org/licenses/LICENSE-2.0
25  *
26  * Unless required by applicable law or agreed to in writing, software
27  * distributed under the License is distributed on an "AS IS" BASIS,
28  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29  * See the License for the specific language governing permissions and
30  * limitations under the License.
31  */
32 
33 package java.lang;
34 
35 import com.android.dex.Dex;
36 import dalvik.system.VMStack;
37 import java.io.InputStream;
38 import java.io.Serializable;
39 import java.lang.annotation.Annotation;
40 import java.lang.reflect.AccessibleObject;
41 import java.lang.reflect.AnnotatedElement;
42 import java.lang.reflect.ArtField;
43 import java.lang.reflect.ArtMethod;
44 import java.lang.reflect.Constructor;
45 import java.lang.reflect.Field;
46 import java.lang.reflect.GenericDeclaration;
47 import java.lang.reflect.InvocationTargetException;
48 import java.lang.reflect.Member;
49 import java.lang.reflect.Method;
50 import java.lang.reflect.Modifier;
51 import java.lang.reflect.Type;
52 import java.lang.reflect.TypeVariable;
53 import java.net.URL;
54 import java.nio.charset.StandardCharsets;
55 import java.security.ProtectionDomain;
56 import java.util.ArrayList;
57 import java.util.Arrays;
58 import java.util.List;
59 import libcore.reflect.AnnotationAccess;
60 import libcore.reflect.GenericSignatureParser;
61 import libcore.reflect.InternalNames;
62 import libcore.reflect.Types;
63 import libcore.util.BasicLruCache;
64 import libcore.util.CollectionUtils;
65 import libcore.util.EmptyArray;
66 import libcore.util.SneakyThrow;
67 
68 /**
69  * The in-memory representation of a Java class. This representation serves as
70  * the starting point for querying class-related information, a process usually
71  * called "reflection". There are basically three types of {@code Class}
72  * instances: those representing real classes and interfaces, those representing
73  * primitive types, and those representing array classes.
74  *
75  * <h4>Class instances representing object types (classes or interfaces)</h4>
76  * <p>
77  * These represent an ordinary class or interface as found in the class
78  * hierarchy. The name associated with these {@code Class} instances is simply
79  * the fully qualified class name of the class or interface that it represents.
80  * In addition to this human-readable name, each class is also associated by a
81  * so-called <em>descriptor</em>, which is the letter "L", followed by the
82  * class name and a semicolon (";"). The descriptor is what the runtime system
83  * uses internally for identifying the class (for example in a DEX file).
84  * </p>
85  * <h4>Classes representing primitive types</h4>
86  * <p>
87  * These represent the standard Java primitive types and hence share their
88  * names (for example "int" for the {@code int} primitive type). Although it is
89  * not possible to create new instances based on these {@code Class} instances,
90  * they are still useful for providing reflection information, and as the
91  * component type of array classes. There is one {@code Class} instance for each
92  * primitive type, and their descriptors are:
93  * </p>
94  * <ul>
95  * <li>{@code B} representing the {@code byte} primitive type</li>
96  * <li>{@code S} representing the {@code short} primitive type</li>
97  * <li>{@code I} representing the {@code int} primitive type</li>
98  * <li>{@code J} representing the {@code long} primitive type</li>
99  * <li>{@code F} representing the {@code float} primitive type</li>
100  * <li>{@code D} representing the {@code double} primitive type</li>
101  * <li>{@code C} representing the {@code char} primitive type</li>
102  * <li>{@code Z} representing the {@code boolean} primitive type</li>
103  * <li>{@code V} representing void function return values</li>
104  * </ul>
105  * <p>
106  * <h4>Classes representing array classes</h4>
107  * <p>
108  * These represent the classes of Java arrays. There is one such {@code Class}
109  * instance per combination of array leaf component type and arity (number of
110  * dimensions). In this case, the name associated with the {@code Class}
111  * consists of one or more left square brackets (one per dimension in the array)
112  * followed by the descriptor of the class representing the leaf component type,
113  * which can be either an object type or a primitive type. The descriptor of a
114  * {@code Class} representing an array type is the same as its name. Examples
115  * of array class descriptors are:
116  * </p>
117  * <ul>
118  * <li>{@code [I} representing the {@code int[]} type</li>
119  * <li>{@code [Ljava/lang/String;} representing the {@code String[]} type</li>
120  * <li>{@code [[[C} representing the {@code char[][][]} type (three dimensions!)</li>
121  * </ul>
122  */
123 public final class Class<T> implements Serializable, AnnotatedElement, GenericDeclaration, Type {
124 
125     private static final long serialVersionUID = 3206093459760846163L;
126 
127     /** defining class loader, or NULL for the "bootstrap" system loader. */
128     private transient ClassLoader classLoader;
129 
130     /**
131      * For array classes, the component class object for instanceof/checkcast (for String[][][],
132      * this will be String[][]). NULL for non-array classes.
133      */
134     private transient Class<?> componentType;
135     /**
136      * DexCache of resolved constant pool entries. Will be null for certain VM-generated classes
137      * e.g. arrays and primitive classes.
138      */
139     private transient DexCache dexCache;
140 
141     /** Short-cut to dexCache.strings */
142     private transient String[] dexCacheStrings;
143 
144     /** static, private, and &lt;init&gt; methods. */
145     private transient ArtMethod[] directMethods;
146 
147     /**
148      * Instance fields. These describe the layout of the contents of an Object. Note that only the
149      * fields directly declared by this class are listed in iFields; fields declared by a
150      * superclass are listed in the superclass's Class.iFields.
151      *
152      * All instance fields that refer to objects are guaranteed to be at the beginning of the field
153      * list.  {@link Class#numReferenceInstanceFields} specifies the number of reference fields.
154      */
155     private transient ArtField[] iFields;
156 
157     /**
158      * The interface table (iftable_) contains pairs of a interface class and an array of the
159      * interface methods. There is one pair per interface supported by this class.  That
160      * means one pair for each interface we support directly, indirectly via superclass, or
161      * indirectly via a superinterface.  This will be null if neither we nor our superclass
162      * implement any interfaces.
163      *
164      * Why we need this: given "class Foo implements Face", declare "Face faceObj = new Foo()".
165      * Invoke faceObj.blah(), where "blah" is part of the Face interface.  We can't easily use a
166      * single vtable.
167      *
168      * For every interface a concrete class implements, we create an array of the concrete vtable_
169      * methods for the methods in the interface.
170      */
171     private transient Object[] ifTable;
172 
173     /** Lazily computed name of this class; always prefer calling getName(). */
174     private transient String name;
175 
176     /** Static fields */
177     private transient ArtField[] sFields;
178 
179     /** The superclass, or NULL if this is java.lang.Object, an interface or primitive type. */
180     private transient Class<? super T> superClass;
181 
182     /** If class verify fails, we must return same error on subsequent tries. */
183     private transient Class<?> verifyErrorClass;
184 
185     /** Virtual methods defined in this class; invoked through vtable. */
186     private transient ArtMethod[] virtualMethods;
187 
188     /**
189      * Virtual method table (vtable), for use by "invoke-virtual". The vtable from the superclass
190      * is copied in, and virtual methods from our class either replace those from the super or are
191      * appended. For abstract classes, methods may be created in the vtable that aren't in
192      * virtual_ methods_ for miranda methods.
193      */
194     private transient ArtMethod[] vtable;
195 
196     /** access flags; low 16 bits are defined by VM spec */
197     private transient int accessFlags;
198 
199     /**
200      * Total size of the Class instance; used when allocating storage on GC heap.
201      * See also {@link Class#objectSize}.
202      */
203     private transient int classSize;
204 
205     /**
206      * tid used to check for recursive static initializer invocation.
207      */
208     private transient int clinitThreadId;
209 
210     /**
211      * Class def index from dex file. An index of 65535 indicates that there is no class definition,
212      * for example for an array type.
213      * TODO: really 16bits as type indices are 16bit.
214      */
215     private transient int dexClassDefIndex;
216 
217     /**
218      * Class type index from dex file, lazily computed. An index of 65535 indicates that the type
219      * index isn't known. Volatile to avoid double-checked locking bugs.
220      * TODO: really 16bits as type indices are 16bit.
221      */
222     private transient volatile int dexTypeIndex;
223 
224     /** Number of instance fields that are object references. */
225     private transient int numReferenceInstanceFields;
226 
227     /** Number of static fields that are object references. */
228     private transient int numReferenceStaticFields;
229 
230     /**
231      * Total object size; used when allocating storage on GC heap. For interfaces and abstract
232      * classes this will be zero. See also {@link Class#classSize}.
233      */
234     private transient int objectSize;
235 
236     /** Primitive type value, or 0 if not a primitive type; set for generated primitive classes. */
237     private transient int primitiveType;
238 
239     /** Bitmap of offsets of iFields. */
240     private transient int referenceInstanceOffsets;
241 
242     /** Bitmap of offsets of sFields. */
243     private transient int referenceStaticOffsets;
244 
245     /** State of class initialization */
246     private transient int status;
247 
Class()248     private Class() {
249         // Prevent this class to be instantiated, instance should be created by JVM only
250     }
251 
252     /**
253      * Returns a {@code Class} object which represents the class with
254      * the given name. The name should be the name of a non-primitive
255      * class, as described in the {@link Class class definition}.
256      * Primitive types can not be found using this method; use {@code
257      * int.class} or {@code Integer.TYPE} instead.
258      *
259      * <p>If the class has not yet been loaded, it is loaded and initialized
260      * first. This is done through either the class loader of the calling class
261      * or one of its parent class loaders. It is possible that a static initializer is run as
262      * a result of this call.
263      *
264      * @throws ClassNotFoundException
265      *             if the requested class cannot be found.
266      * @throws LinkageError
267      *             if an error occurs during linkage
268      * @throws ExceptionInInitializerError
269      *             if an exception occurs during static initialization of a
270      *             class.
271      */
forName(String className)272     public static Class<?> forName(String className) throws ClassNotFoundException {
273         return forName(className, true, VMStack.getCallingClassLoader());
274     }
275 
276     /**
277      * Returns a {@code Class} object which represents the class with
278      * the given name. The name should be the name of a non-primitive
279      * class, as described in the {@link Class class definition}.
280      * Primitive types can not be found using this method; use {@code
281      * int.class} or {@code Integer.TYPE} instead.
282      *
283      * <p>If the class has not yet been loaded, it is loaded first, using the given class loader.
284      * If the class has not yet been initialized and {@code shouldInitialize} is true,
285      * the class will be initialized.
286      *
287      * @throws ClassNotFoundException
288      *             if the requested class cannot be found.
289      * @throws LinkageError
290      *             if an error occurs during linkage
291      * @throws ExceptionInInitializerError
292      *             if an exception occurs during static initialization of a
293      *             class.
294      */
forName(String className, boolean shouldInitialize, ClassLoader classLoader)295     public static Class<?> forName(String className, boolean shouldInitialize,
296             ClassLoader classLoader) throws ClassNotFoundException {
297 
298         if (classLoader == null) {
299             classLoader = ClassLoader.getSystemClassLoader();
300         }
301         // Catch an Exception thrown by the underlying native code. It wraps
302         // up everything inside a ClassNotFoundException, even if e.g. an
303         // Error occurred during initialization. This as a workaround for
304         // an ExceptionInInitializerError that's also wrapped. It is actually
305         // expected to be thrown. Maybe the same goes for other errors.
306         // Not wrapping up all the errors will break android though.
307         Class<?> result;
308         try {
309             result = classForName(className, shouldInitialize, classLoader);
310         } catch (ClassNotFoundException e) {
311             Throwable cause = e.getCause();
312             if (cause instanceof LinkageError) {
313                 throw (LinkageError) cause;
314             }
315             throw e;
316         }
317         return result;
318     }
319 
classForName(String className, boolean shouldInitialize, ClassLoader classLoader)320     static native Class<?> classForName(String className, boolean shouldInitialize,
321             ClassLoader classLoader) throws ClassNotFoundException;
322 
323     /**
324      * Returns an array containing {@code Class} objects for all
325      * public classes, interfaces, enums and annotations that are
326      * members of this class and its superclasses. This does not
327      * include classes of implemented interfaces.  If there are no
328      * such class members or if this object represents a primitive
329      * type then an array of length 0 is returned.
330      */
getClasses()331     public Class<?>[] getClasses() {
332         List<Class<?>> result = new ArrayList<Class<?>>();
333         for (Class<?> c = this; c != null; c = c.superClass) {
334             for (Class<?> member : c.getDeclaredClasses()) {
335                 if (Modifier.isPublic(member.getModifiers())) {
336                     result.add(member);
337                 }
338             }
339         }
340         return result.toArray(new Class[result.size()]);
341     }
342 
getAnnotation(Class<A> annotationType)343     @Override public <A extends Annotation> A getAnnotation(Class<A> annotationType) {
344         return AnnotationAccess.getAnnotation(this, annotationType);
345     }
346 
347     /**
348      * Returns an array containing all the annotations of this class. If there are no annotations
349      * then an empty array is returned.
350      *
351      * @see #getDeclaredAnnotations()
352      */
getAnnotations()353     @Override public Annotation[] getAnnotations() {
354         return AnnotationAccess.getAnnotations(this);
355     }
356 
357     /**
358      * Returns the canonical name of this class. If this class does not have a
359      * canonical name as defined in the Java Language Specification, then the
360      * method returns {@code null}.
361      */
getCanonicalName()362     public String getCanonicalName() {
363         if (isLocalClass() || isAnonymousClass())
364             return null;
365 
366         if (isArray()) {
367             /*
368              * The canonical name of an array type depends on the (existence of)
369              * the component type's canonical name.
370              */
371             String name = getComponentType().getCanonicalName();
372             if (name != null) {
373                 return name + "[]";
374             }
375         } else if (isMemberClass()) {
376             /*
377              * The canonical name of an inner class depends on the (existence
378              * of) the declaring class' canonical name.
379              */
380             String name = getDeclaringClass().getCanonicalName();
381             if (name != null) {
382                 return name + "." + getSimpleName();
383             }
384         } else {
385             /*
386              * The canonical name of a top-level class or primitive type is
387              * equal to the fully qualified name.
388              */
389             return getName();
390         }
391 
392         /*
393          * Other classes don't have a canonical name.
394          */
395         return null;
396     }
397 
398     /**
399      * Returns the class loader which was used to load the class represented by
400      * this {@code Class}. Implementations are free to return {@code null} for
401      * classes that were loaded by the bootstrap class loader. The Android
402      * reference implementation, though, always returns a reference to an actual
403      * class loader.
404      */
getClassLoader()405     public ClassLoader getClassLoader() {
406         if (this.isPrimitive()) {
407             return null;
408         }
409 
410         ClassLoader loader = getClassLoaderImpl();
411         if (loader == null) {
412             loader = BootClassLoader.getInstance();
413         }
414         return loader;
415     }
416 
417     /**
418      * This must be provided by the VM vendor, as it is used by other provided
419      * class implementations in this package. Outside of this class, it is used
420      * by SecurityManager.classLoaderDepth(),
421      * currentClassLoader() and currentLoadedClass(). Return the ClassLoader for
422      * this Class without doing any security checks. The bootstrap ClassLoader
423      * is returned, unlike getClassLoader() which returns null in place of the
424      * bootstrap ClassLoader.
425      */
getClassLoaderImpl()426     ClassLoader getClassLoaderImpl() {
427         ClassLoader loader = classLoader;
428         return loader == null ? BootClassLoader.getInstance() : loader;
429     }
430 
431     /**
432      * Returns a {@code Class} object which represents the component type if
433      * this class represents an array type. Returns {@code null} if this class
434      * does not represent an array type. The component type of an array type is
435      * the type of the elements of the array.
436      */
getComponentType()437     public Class<?> getComponentType() {
438       return componentType;
439     }
440 
441     /**
442      * Returns the dex file from which this class was loaded.
443      *
444      * @hide
445      */
getDex()446     public Dex getDex() {
447         if (dexCache == null) {
448             return null;
449         }
450         return dexCache.getDex();
451     }
452 
453     /**
454      * Returns a string from the dex cache, computing the string from the dex file if necessary.
455      *
456      * @hide
457      */
getDexCacheString(Dex dex, int dexStringIndex)458     public String getDexCacheString(Dex dex, int dexStringIndex) {
459         String s = dexCacheStrings[dexStringIndex];
460         if (s == null) {
461             s = dex.strings().get(dexStringIndex).intern();
462             dexCacheStrings[dexStringIndex] = s;
463         }
464         return s;
465     }
466 
467     /**
468      * Returns a resolved type from the dex cache, computing the type from the dex file if
469      * necessary.
470      *
471      * @hide
472      */
getDexCacheType(Dex dex, int dexTypeIndex)473     public Class<?> getDexCacheType(Dex dex, int dexTypeIndex) {
474         Class<?>[] dexCacheResolvedTypes = dexCache.resolvedTypes;
475         Class<?> resolvedType = dexCacheResolvedTypes[dexTypeIndex];
476         if (resolvedType == null) {
477             int descriptorIndex = dex.typeIds().get(dexTypeIndex);
478             String descriptor = getDexCacheString(dex, descriptorIndex);
479             resolvedType = InternalNames.getClass(getClassLoader(), descriptor);
480             dexCacheResolvedTypes[dexTypeIndex] = resolvedType;
481         }
482         return resolvedType;
483     }
484 
485     /**
486      * Returns a {@code Constructor} object which represents the public
487      * constructor matching the given parameter types.
488      * {@code (Class[]) null} is equivalent to the empty array.
489      *
490      * @throws NoSuchMethodException
491      *             if the constructor cannot be found.
492      * @see #getDeclaredConstructor(Class[])
493      */
getConstructor(Class<?>.... parameterTypes)494     public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException {
495         return getConstructor(parameterTypes, true);
496     }
497 
498     /**
499      * Returns a {@code Constructor} object which represents the constructor
500      * matching the specified parameter types that is declared by the class
501      * represented by this {@code Class}.
502      * {@code (Class[]) null} is equivalent to the empty array.
503      *
504      * @throws NoSuchMethodException
505      *             if the requested constructor cannot be found.
506      * @see #getConstructor(Class[])
507      */
getDeclaredConstructor(Class<?>.... parameterTypes)508     public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
509             throws NoSuchMethodException {
510         return getConstructor(parameterTypes, false);
511     }
512 
513     /**
514      * Returns a constructor with the given parameters.
515      *
516      * @param publicOnly true to only return public constructores.
517      * @param parameterTypes argument types to match the constructor's.
518      */
getConstructor(Class<?>[] parameterTypes, boolean publicOnly)519     private Constructor<T> getConstructor(Class<?>[] parameterTypes, boolean publicOnly)
520             throws NoSuchMethodException {
521         if (parameterTypes == null) {
522             parameterTypes = EmptyArray.CLASS;
523         }
524         for (Class<?> c : parameterTypes) {
525             if (c == null) {
526                 throw new NoSuchMethodException("parameter type is null");
527             }
528         }
529         Constructor<T> result = getDeclaredConstructorInternal(parameterTypes);
530         if (result == null || publicOnly && !Modifier.isPublic(result.getAccessFlags())) {
531             throw new NoSuchMethodException("<init> " + Arrays.toString(parameterTypes));
532         }
533         return result;
534     }
535 
536     /**
537      * Returns the constructor with the given parameters if it is defined by this class; null
538      * otherwise. This may return a non-public member.
539      *
540      * @param args the types of the parameters to the constructor.
541      */
getDeclaredConstructorInternal(Class<?>[] args)542     private Constructor<T> getDeclaredConstructorInternal(Class<?>[] args) {
543         if (directMethods != null) {
544             for (ArtMethod m : directMethods) {
545                 int modifiers = m.getAccessFlags();
546                 if (Modifier.isStatic(modifiers)) {
547                     // skip <clinit> which is a static constructor
548                     continue;
549                 }
550                 if (!Modifier.isConstructor(modifiers)) {
551                     continue;
552                 }
553                 if (!ArtMethod.equalConstructorParameters(m, args)) {
554                     continue;
555                 }
556                 return new Constructor<T>(m);
557             }
558         }
559         return null;
560     }
561 
562     /**
563      * Returns an array containing {@code Constructor} objects for all public
564      * constructors for this {@code Class}. If there
565      * are no public constructors or if this {@code Class} represents an array
566      * class, a primitive type or void then an empty array is returned.
567      *
568      * @see #getDeclaredConstructors()
569      */
getConstructors()570     public Constructor<?>[] getConstructors() {
571         ArrayList<Constructor<T>> constructors = new ArrayList();
572         getDeclaredConstructors(true, constructors);
573         return constructors.toArray(new Constructor[constructors.size()]);
574     }
575 
576     /**
577      * Returns an array containing {@code Constructor} objects for all
578      * constructors declared in the class represented by this {@code Class}. If
579      * there are no constructors or if this {@code Class} represents an array
580      * class, a primitive type or void then an empty array is returned.
581      *
582      * @see #getConstructors()
583      */
getDeclaredConstructors()584     public Constructor<?>[] getDeclaredConstructors() {
585         ArrayList<Constructor<T>> constructors = new ArrayList();
586         getDeclaredConstructors(false, constructors);
587         return constructors.toArray(new Constructor[constructors.size()]);
588     }
589 
getDeclaredConstructors(boolean publicOnly, List<Constructor<T>> constructors)590     private void getDeclaredConstructors(boolean publicOnly, List<Constructor<T>> constructors) {
591         if (directMethods != null) {
592             for (ArtMethod m : directMethods) {
593                 int modifiers = m.getAccessFlags();
594                 if (!publicOnly || Modifier.isPublic(modifiers)) {
595                     if (Modifier.isStatic(modifiers)) {
596                         // skip <clinit> which is a static constructor
597                         continue;
598                     }
599                     if (Modifier.isConstructor(modifiers)) {
600                         constructors.add(new Constructor<T>(m));
601                     }
602                 }
603             }
604         }
605     }
606 
607     /**
608      * Returns a {@code Method} object which represents the method matching the
609      * specified name and parameter types that is declared by the class
610      * represented by this {@code Class}.
611      *
612      * @param name
613      *            the requested method's name.
614      * @param parameterTypes
615      *            the parameter types of the requested method.
616      *            {@code (Class[]) null} is equivalent to the empty array.
617      * @return the method described by {@code name} and {@code parameterTypes}.
618      * @throws NoSuchMethodException
619      *             if the requested constructor cannot be found.
620      * @throws NullPointerException
621      *             if {@code name} is {@code null}.
622      * @see #getMethod(String, Class[])
623      */
getDeclaredMethod(String name, Class<?>... parameterTypes)624     public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
625             throws NoSuchMethodException {
626         return getMethod(name, parameterTypes, false);
627     }
628 
629     /**
630      * Returns a {@code Method} object which represents the public method with
631      * the specified name and parameter types.
632      * {@code (Class[]) null} is equivalent to the empty array.
633      * This method first searches the
634      * class C represented by this {@code Class}, then the superclasses of C and
635      * finally the interfaces implemented by C and finally the superclasses of C
636      * for a method with matching name.
637      *
638      * @throws NoSuchMethodException
639      *             if the method cannot be found.
640      * @see #getDeclaredMethod(String, Class[])
641      */
getMethod(String name, Class<?>... parameterTypes)642     public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException {
643         return getMethod(name, parameterTypes, true);
644     }
645 
getMethod(String name, Class<?>[] parameterTypes, boolean recursivePublicMethods)646     private Method getMethod(String name, Class<?>[] parameterTypes, boolean recursivePublicMethods)
647             throws NoSuchMethodException {
648         if (name == null) {
649             throw new NullPointerException("name == null");
650         }
651         if (parameterTypes == null) {
652             parameterTypes = EmptyArray.CLASS;
653         }
654         for (Class<?> c : parameterTypes) {
655             if (c == null) {
656                 throw new NoSuchMethodException("parameter type is null");
657             }
658         }
659         Method result = recursivePublicMethods ? getPublicMethodRecursive(name, parameterTypes)
660                                                : getDeclaredMethodInternal(name, parameterTypes);
661         // Fail if we didn't find the method or it was expected to be public.
662         if (result == null ||
663             (recursivePublicMethods && !Modifier.isPublic(result.getAccessFlags()))) {
664             throw new NoSuchMethodException(name + " " + Arrays.toString(parameterTypes));
665         }
666         return result;
667     }
668 
getPublicMethodRecursive(String name, Class<?>[] parameterTypes)669     private Method getPublicMethodRecursive(String name, Class<?>[] parameterTypes) {
670         // search superclasses
671         for (Class<?> c = this; c != null; c = c.getSuperclass()) {
672             Method result = c.getDeclaredMethodInternal(name, parameterTypes);
673             if (result != null && Modifier.isPublic(result.getAccessFlags())) {
674                 return result;
675             }
676         }
677         // search iftable which has a flattened and uniqued list of interfaces
678         Object[] iftable = ifTable;
679         if (iftable != null) {
680             for (int i = 0; i < iftable.length; i += 2) {
681                 Class<?> ifc = (Class<?>) iftable[i];
682                 Method result = ifc.getPublicMethodRecursive(name, parameterTypes);
683                 if (result != null && Modifier.isPublic(result.getAccessFlags())) {
684                     return result;
685                 }
686             }
687         }
688         return null;
689     }
690 
691     /**
692      * Returns the method if it is defined by this class; null otherwise. This may return a
693      * non-public member.
694      *
695      * @param name the method name
696      * @param args the method's parameter types
697      */
getDeclaredMethodInternal(String name, Class<?>[] args)698     private Method getDeclaredMethodInternal(String name, Class<?>[] args) {
699         // Covariant return types permit the class to define multiple
700         // methods with the same name and parameter types. Prefer to
701         // return a non-synthetic method in such situations. We may
702         // still return a synthetic method to handle situations like
703         // escalated visibility. We never return miranda methods that
704         // were synthesized by the VM.
705         int skipModifiers = Modifier.MIRANDA | Modifier.SYNTHETIC;
706         ArtMethod artMethodResult = null;
707         if (virtualMethods != null) {
708             for (ArtMethod m : virtualMethods) {
709                 String methodName = ArtMethod.getMethodName(m);
710                 if (!name.equals(methodName)) {
711                     continue;
712                 }
713                 if (!ArtMethod.equalMethodParameters(m, args)) {
714                     continue;
715                 }
716                 int modifiers = m.getAccessFlags();
717                 if ((modifiers & skipModifiers) == 0) {
718                     return new Method(m);
719                 }
720                 if ((modifiers & Modifier.MIRANDA) == 0) {
721                     // Remember as potential result if it's not a miranda method.
722                     artMethodResult = m;
723                 }
724             }
725         }
726         if (artMethodResult == null) {
727             if (directMethods != null) {
728                 for (ArtMethod m : directMethods) {
729                     int modifiers = m.getAccessFlags();
730                     if (Modifier.isConstructor(modifiers)) {
731                         continue;
732                     }
733                     String methodName = ArtMethod.getMethodName(m);
734                     if (!name.equals(methodName)) {
735                         continue;
736                     }
737                     if (!ArtMethod.equalMethodParameters(m, args)) {
738                         continue;
739                     }
740                     if ((modifiers & skipModifiers) == 0) {
741                         return new Method(m);
742                     }
743                     // Direct methods cannot be miranda methods,
744                     // so this potential result must be synthetic.
745                     artMethodResult = m;
746                 }
747             }
748         }
749         if (artMethodResult == null) {
750             return null;
751         }
752         return new Method(artMethodResult);
753     }
754 
755     /**
756      * Returns an array containing {@code Method} objects for all methods
757      * declared in the class represented by this {@code Class}. If there are no
758      * methods or if this {@code Class} represents an array class, a primitive
759      * type or void then an empty array is returned.
760      *
761      * @see #getMethods()
762      */
getDeclaredMethods()763     public Method[] getDeclaredMethods() {
764         int initial_size = virtualMethods == null ? 0 : virtualMethods.length;
765         initial_size += directMethods == null ? 0 : directMethods.length;
766         ArrayList<Method> methods = new ArrayList<Method>(initial_size);
767         getDeclaredMethodsUnchecked(false, methods);
768         Method[] result = methods.toArray(new Method[methods.size()]);
769         for (Method m : result) {
770             // Throw NoClassDefFoundError if types cannot be resolved.
771             m.getReturnType();
772             m.getParameterTypes();
773         }
774         return result;
775 
776     }
777 
778     /**
779      * Populates a list of methods without performing any security or type
780      * resolution checks first. If no methods exist, the list is not modified.
781      *
782      * @param publicOnly Whether to return only public methods.
783      * @param methods A list to populate with declared methods.
784      * @hide
785      */
getDeclaredMethodsUnchecked(boolean publicOnly, List<Method> methods)786     public void getDeclaredMethodsUnchecked(boolean publicOnly, List<Method> methods) {
787         if (virtualMethods != null) {
788             for (ArtMethod m : virtualMethods) {
789                 int modifiers = m.getAccessFlags();
790                 if (!publicOnly || Modifier.isPublic(modifiers)) {
791                     // Add non-miranda virtual methods.
792                     if ((modifiers & Modifier.MIRANDA) == 0) {
793                         methods.add(new Method(m));
794                     }
795                 }
796             }
797         }
798         if (directMethods != null) {
799             for (ArtMethod m : directMethods) {
800                 int modifiers = m.getAccessFlags();
801                 if (!publicOnly || Modifier.isPublic(modifiers)) {
802                     // Add non-constructor direct/static methods.
803                     if (!Modifier.isConstructor(modifiers)) {
804                         methods.add(new Method(m));
805                     }
806                 }
807             }
808         }
809     }
810 
811     /**
812      * Returns an array containing {@code Method} objects for all public methods
813      * for the class C represented by this {@code Class}. Methods may be
814      * declared in C, the interfaces it implements or in the superclasses of C.
815      * The elements in the returned array are in no particular order.
816      *
817      * <p>If there are no public methods or if this {@code Class} represents a
818      * primitive type or {@code void} then an empty array is returned.
819      *
820      * @see #getDeclaredMethods()
821      */
getMethods()822     public Method[] getMethods() {
823         List<Method> methods = new ArrayList<Method>();
824         getPublicMethodsInternal(methods);
825         /*
826          * Remove duplicate methods defined by superclasses and
827          * interfaces, preferring to keep methods declared by derived
828          * types.
829          */
830         CollectionUtils.removeDuplicates(methods, Method.ORDER_BY_SIGNATURE);
831         return methods.toArray(new Method[methods.size()]);
832     }
833 
834     /**
835      * Populates {@code result} with public methods defined by this class, its
836      * superclasses, and all implemented interfaces, including overridden methods.
837      */
getPublicMethodsInternal(List<Method> result)838     private void getPublicMethodsInternal(List<Method> result) {
839         getDeclaredMethodsUnchecked(true, result);
840         if (!isInterface()) {
841             // Search superclasses, for interfaces don't search java.lang.Object.
842             for (Class<?> c = superClass; c != null; c = c.superClass) {
843                 c.getDeclaredMethodsUnchecked(true, result);
844             }
845         }
846         // Search iftable which has a flattened and uniqued list of interfaces.
847         Object[] iftable = ifTable;
848         if (iftable != null) {
849             for (int i = 0; i < iftable.length; i += 2) {
850                 Class<?> ifc = (Class<?>) iftable[i];
851                 ifc.getDeclaredMethodsUnchecked(true, result);
852             }
853         }
854     }
855 
856     /**
857      * Returns the annotations that are directly defined on the class
858      * represented by this {@code Class}. Annotations that are inherited are not
859      * included in the result. If there are no annotations at all, an empty
860      * array is returned.
861      *
862      * @see #getAnnotations()
863      */
getDeclaredAnnotations()864     @Override public Annotation[] getDeclaredAnnotations() {
865         List<Annotation> result = AnnotationAccess.getDeclaredAnnotations(this);
866         return result.toArray(new Annotation[result.size()]);
867     }
868 
869     /**
870      * Returns an array containing {@code Class} objects for all classes,
871      * interfaces, enums and annotations that are members of this class.
872      */
getDeclaredClasses()873     public Class<?>[] getDeclaredClasses() {
874         return AnnotationAccess.getMemberClasses(this);
875     }
876 
877     /**
878      * Returns a {@code Field} object for the field with the given name
879      * which is declared in the class represented by this {@code Class}.
880      *
881      * @throws NoSuchFieldException if the requested field can not be found.
882      * @see #getField(String)
883      */
getDeclaredField(String name)884     public Field getDeclaredField(String name) throws NoSuchFieldException {
885         if (name == null) {
886             throw new NullPointerException("name == null");
887         }
888         Field result = getDeclaredFieldInternal(name);
889         if (result == null) {
890             throw new NoSuchFieldException(name);
891         } else {
892             result.getType();  // Throw NoClassDefFoundError if type cannot be resolved.
893         }
894         return result;
895     }
896 
897     /**
898      * Returns an array containing {@code Field} objects for all fields declared
899      * in the class represented by this {@code Class}. If there are no fields or
900      * if this {@code Class} represents an array class, a primitive type or void
901      * then an empty array is returned.
902      *
903      * @see #getFields()
904      */
getDeclaredFields()905     public Field[] getDeclaredFields() {
906         int initial_size = sFields == null ? 0 : sFields.length;
907         initial_size += iFields == null ? 0 : iFields.length;
908         ArrayList<Field> fields = new ArrayList(initial_size);
909         getDeclaredFieldsUnchecked(false, fields);
910         Field[] result = fields.toArray(new Field[fields.size()]);
911         for (Field f : result) {
912             f.getType();  // Throw NoClassDefFoundError if type cannot be resolved.
913         }
914         return result;
915     }
916 
917     /**
918      * Populates a list of fields without performing any security or type
919      * resolution checks first. If no fields exist, the list is not modified.
920      *
921      * @param publicOnly Whether to return only public fields.
922      * @param fields A list to populate with declared fields.
923      * @hide
924      */
getDeclaredFieldsUnchecked(boolean publicOnly, List<Field> fields)925     public void getDeclaredFieldsUnchecked(boolean publicOnly, List<Field> fields) {
926         if (iFields != null) {
927             for (ArtField f : iFields) {
928                 if (!publicOnly || Modifier.isPublic(f.getAccessFlags())) {
929                     fields.add(new Field(f));
930                 }
931             }
932         }
933         if (sFields != null) {
934             for (ArtField f : sFields) {
935                 if (!publicOnly || Modifier.isPublic(f.getAccessFlags())) {
936                     fields.add(new Field(f));
937                 }
938             }
939         }
940     }
941 
942     /**
943      * Returns the field if it is defined by this class; null otherwise. This
944      * may return a non-public member.
945      */
getDeclaredFieldInternal(String name)946     private Field getDeclaredFieldInternal(String name) {
947 
948         if (iFields != null) {
949             final ArtField matched = findByName(name, iFields);
950             if (matched != null) {
951                 return new Field(matched);
952             }
953         }
954         if (sFields != null) {
955             final ArtField matched = findByName(name, sFields);
956             if (matched != null) {
957                 return new Field(matched);
958             }
959         }
960 
961         return null;
962     }
963 
964     /**
965      * Performs a binary search through {@code fields} for a field whose name
966      * is {@code name}. Returns {@code null} if no matching field exists.
967      */
findByName(String name, ArtField[] fields)968     private static ArtField findByName(String name, ArtField[] fields) {
969         int low = 0, high = fields.length - 1;
970         while (low <= high) {
971             final int mid = (low + high) >>> 1;
972             final ArtField f = fields[mid];
973             final int result = f.getName().compareTo(name);
974             if (result < 0) {
975                 low = mid + 1;
976             } else if (result == 0) {
977                 return f;
978             } else {
979                 high = mid - 1;
980             }
981         }
982 
983         return null;
984     }
985 
986     /**
987      * Returns the class that this class is a member of, or {@code null} if this
988      * class is a top-level class, a primitive, an array, or defined within a
989      * method or constructor.
990      */
getDeclaringClass()991     public Class<?> getDeclaringClass() {
992         if (AnnotationAccess.isAnonymousClass(this)) {
993             return null;
994         }
995         return AnnotationAccess.getEnclosingClass(this);
996     }
997 
998     /**
999      * Returns the class enclosing this class. For most classes this is the same
1000      * as the {@link #getDeclaringClass() declaring class}. For classes defined
1001      * within a method or constructor (typically anonymous inner classes), this
1002      * is the declaring class of that member.
1003      */
getEnclosingClass()1004     public Class<?> getEnclosingClass() {
1005         Class<?> declaringClass = getDeclaringClass();
1006         if (declaringClass != null) {
1007             return declaringClass;
1008         }
1009         AccessibleObject member = AnnotationAccess.getEnclosingMethodOrConstructor(this);
1010         if (member != null)  {
1011             return ((Member) member).getDeclaringClass();
1012         }
1013         return AnnotationAccess.getEnclosingClass(this);
1014     }
1015 
1016     /**
1017      * Returns the enclosing {@code Constructor} of this {@code Class}, if it is an
1018      * anonymous or local/automatic class; otherwise {@code null}.
1019      */
getEnclosingConstructor()1020     public Constructor<?> getEnclosingConstructor() {
1021         if (classNameImpliesTopLevel()) {
1022             return null;
1023         }
1024         AccessibleObject result = AnnotationAccess.getEnclosingMethodOrConstructor(this);
1025         return result instanceof Constructor ? (Constructor<?>) result : null;
1026     }
1027 
1028     /**
1029      * Returns the enclosing {@code Method} of this {@code Class}, if it is an
1030      * anonymous or local/automatic class; otherwise {@code null}.
1031      */
getEnclosingMethod()1032     public Method getEnclosingMethod() {
1033         if (classNameImpliesTopLevel()) {
1034             return null;
1035         }
1036         AccessibleObject result = AnnotationAccess.getEnclosingMethodOrConstructor(this);
1037         return result instanceof Method ? (Method) result : null;
1038     }
1039 
1040     /**
1041      * Returns true if this class is definitely a top level class, or false if
1042      * a more expensive check like {@link #getEnclosingClass()} is necessary.
1043      *
1044      * <p>This is a hack that exploits an implementation detail of all Java
1045      * language compilers: generated names always contain "$". As it is possible
1046      * for a top level class to be named with a "$", a false result <strong>does
1047      * not</strong> indicate that this isn't a top-level class.
1048      */
classNameImpliesTopLevel()1049     private boolean classNameImpliesTopLevel() {
1050         return !getName().contains("$");
1051     }
1052 
1053     /**
1054      * Returns the {@code enum} constants associated with this {@code Class}.
1055      * Returns {@code null} if this {@code Class} does not represent an {@code
1056      * enum} type.
1057      */
1058     @SuppressWarnings("unchecked") // we only cast after confirming that this class is an enum
getEnumConstants()1059     public T[] getEnumConstants() {
1060         if (!isEnum()) {
1061             return null;
1062         }
1063         return (T[]) Enum.getSharedConstants((Class) this).clone();
1064     }
1065 
1066     /**
1067      * Returns a {@code Field} object which represents the public field with the
1068      * given name. This method first searches the class C represented by
1069      * this {@code Class}, then the interfaces implemented by C and finally the
1070      * superclasses of C.
1071      *
1072      * @throws NoSuchFieldException
1073      *             if the field cannot be found.
1074      * @see #getDeclaredField(String)
1075      */
getField(String name)1076     public Field getField(String name) throws NoSuchFieldException {
1077         if (name == null) {
1078             throw new NullPointerException("name == null");
1079         }
1080         Field result = getPublicFieldRecursive(name);
1081         if (result == null) {
1082             throw new NoSuchFieldException(name);
1083         } else {
1084             result.getType();  // Throw NoClassDefFoundError if type cannot be resolved.
1085         }
1086         return result;
1087     }
1088 
getPublicFieldRecursive(String name)1089     private Field getPublicFieldRecursive(String name) {
1090         // search superclasses
1091         for (Class<?> c = this; c != null; c = c.superClass) {
1092             Field result = c.getDeclaredFieldInternal(name);
1093             if (result != null && (result.getModifiers() & Modifier.PUBLIC) != 0) {
1094                 return result;
1095             }
1096         }
1097 
1098         // search iftable which has a flattened and uniqued list of interfaces
1099         if (ifTable != null) {
1100             for (int i = 0; i < ifTable.length; i += 2) {
1101                 Class<?> ifc = (Class<?>) ifTable[i];
1102                 Field result = ifc.getPublicFieldRecursive(name);
1103                 if (result != null && (result.getModifiers() & Modifier.PUBLIC) != 0) {
1104                     return result;
1105                 }
1106             }
1107         }
1108 
1109         return null;
1110     }
1111 
1112     /**
1113      * Returns an array containing {@code Field} objects for all public fields
1114      * for the class C represented by this {@code Class}. Fields may be declared
1115      * in C, the interfaces it implements or in the superclasses of C. The
1116      * elements in the returned array are in no particular order.
1117      *
1118      * <p>If there are no public fields or if this class represents an array class,
1119      * a primitive type or {@code void} then an empty array is returned.
1120      *
1121      * @see #getDeclaredFields()
1122      */
getFields()1123     public Field[] getFields() {
1124         List<Field> fields = new ArrayList<Field>();
1125         getPublicFieldsRecursive(fields);
1126         Field[] result = fields.toArray(new Field[fields.size()]);
1127         for (Field f : result) {
1128             f.getType();  // Throw NoClassDefFoundError if type cannot be resolved.
1129         }
1130         return result;
1131     }
1132 
1133     /**
1134      * Populates {@code result} with public fields defined by this class, its
1135      * superclasses, and all implemented interfaces.
1136      */
getPublicFieldsRecursive(List<Field> result)1137     private void getPublicFieldsRecursive(List<Field> result) {
1138         // search superclasses
1139         for (Class<?> c = this; c != null; c = c.superClass) {
1140             c.getDeclaredFieldsUnchecked(true, result);
1141         }
1142 
1143         // search iftable which has a flattened and uniqued list of interfaces
1144         Object[] iftable = ifTable;
1145         if (iftable != null) {
1146             for (int i = 0; i < iftable.length; i += 2) {
1147                 Class<?> ifc = (Class<?>) iftable[i];
1148                 ifc.getDeclaredFieldsUnchecked(true, result);
1149             }
1150         }
1151     }
1152 
1153     /**
1154      * Returns the {@link Type}s of the interfaces that this {@code Class} directly
1155      * implements. If the {@code Class} represents a primitive type or {@code
1156      * void} then an empty array is returned.
1157      */
getGenericInterfaces()1158     public Type[] getGenericInterfaces() {
1159         Type[] result;
1160         synchronized (Caches.genericInterfaces) {
1161             result = Caches.genericInterfaces.get(this);
1162             if (result == null) {
1163                 String annotationSignature = AnnotationAccess.getSignature(this);
1164                 if (annotationSignature == null) {
1165                     result = getInterfaces();
1166                 } else {
1167                     GenericSignatureParser parser = new GenericSignatureParser(getClassLoader());
1168                     parser.parseForClass(this, annotationSignature);
1169                     result = Types.getTypeArray(parser.interfaceTypes, false);
1170                 }
1171                 Caches.genericInterfaces.put(this, result);
1172             }
1173         }
1174         return (result.length == 0) ? result : result.clone();
1175     }
1176 
1177     /**
1178      * Returns the {@code Type} that represents the superclass of this {@code
1179      * class}.
1180      */
getGenericSuperclass()1181     public Type getGenericSuperclass() {
1182         Type genericSuperclass = getSuperclass();
1183         // This method is specified to return null for all cases where getSuperclass
1184         // returns null, i.e, for primitives, interfaces, void and java.lang.Object.
1185         if (genericSuperclass == null) {
1186             return null;
1187         }
1188 
1189         String annotationSignature = AnnotationAccess.getSignature(this);
1190         if (annotationSignature != null) {
1191             GenericSignatureParser parser = new GenericSignatureParser(getClassLoader());
1192             parser.parseForClass(this, annotationSignature);
1193             genericSuperclass = parser.superclassType;
1194         }
1195         return Types.getType(genericSuperclass);
1196     }
1197 
1198     /**
1199      * Returns an array of {@code Class} objects that match the interfaces
1200      * in the {@code implements} declaration of the class represented
1201      * by this {@code Class}. The order of the elements in the array is
1202      * identical to the order in the original class declaration. If the class
1203      * does not implement any interfaces, an empty array is returned.
1204      *
1205      * <p>This method only returns directly-implemented interfaces, and does not
1206      * include interfaces implemented by superclasses or superinterfaces of any
1207      * implemented interfaces.
1208      */
getInterfaces()1209     public Class<?>[] getInterfaces() {
1210         if (isArray()) {
1211             return new Class<?>[] { Cloneable.class, Serializable.class };
1212         } else if (isProxy()) {
1213             return getProxyInterfaces();
1214         }
1215         Dex dex = getDex();
1216         if (dex == null) {
1217             return EmptyArray.CLASS;
1218         }
1219         short[] interfaces = dex.interfaceTypeIndicesFromClassDefIndex(dexClassDefIndex);
1220         Class<?>[] result = new Class<?>[interfaces.length];
1221         for (int i = 0; i < interfaces.length; i++) {
1222             result[i] = getDexCacheType(dex, interfaces[i]);
1223         }
1224         return result;
1225     }
1226 
1227     // Returns the interfaces that this proxy class directly implements.
getProxyInterfaces()1228     private native Class<?>[] getProxyInterfaces();
1229 
1230     /**
1231      * Returns an integer that represents the modifiers of the class represented
1232      * by this {@code Class}. The returned value is a combination of bits
1233      * defined by constants in the {@link Modifier} class.
1234      */
getModifiers()1235     public int getModifiers() {
1236         // Array classes inherit modifiers from their component types, but in the case of arrays
1237         // of an inner class, the class file may contain "fake" access flags because it's not valid
1238         // for a top-level class to private, say. The real access flags are stored in the InnerClass
1239         // attribute, so we need to make sure we drill down to the inner class: the accessFlags
1240         // field is not the value we want to return, and the synthesized array class does not itself
1241         // have an InnerClass attribute. https://code.google.com/p/android/issues/detail?id=56267
1242         if (isArray()) {
1243             int componentModifiers = getComponentType().getModifiers();
1244             if ((componentModifiers & Modifier.INTERFACE) != 0) {
1245                 componentModifiers &= ~(Modifier.INTERFACE | Modifier.STATIC);
1246             }
1247             return Modifier.ABSTRACT | Modifier.FINAL | componentModifiers;
1248         }
1249         int JAVA_FLAGS_MASK = 0xffff;
1250         int modifiers = AnnotationAccess.getInnerClassFlags(this, accessFlags & JAVA_FLAGS_MASK);
1251         return modifiers & JAVA_FLAGS_MASK;
1252     }
1253 
1254     /**
1255      * Returns the name of the class represented by this {@code Class}. For a
1256      * description of the format which is used, see the class definition of
1257      * {@link Class}.
1258      */
getName()1259     public String getName() {
1260         String result = name;
1261         return (result == null) ? (name = getNameNative()) : result;
1262     }
1263 
getNameNative()1264     private native String getNameNative();
1265 
1266     /**
1267      * Returns the simple name of the class represented by this {@code Class} as
1268      * defined in the source code. If there is no name (that is, the class is
1269      * anonymous) then an empty string is returned. If the receiver is an array
1270      * then the name of the underlying type with square braces appended (for
1271      * example {@code "Integer[]"}) is returned.
1272      *
1273      * @return the simple name of the class represented by this {@code Class}.
1274      */
getSimpleName()1275     public String getSimpleName() {
1276         if (isArray()) {
1277             return getComponentType().getSimpleName() + "[]";
1278         }
1279 
1280         if (isAnonymousClass()) {
1281             return "";
1282         }
1283 
1284         if (isMemberClass() || isLocalClass()) {
1285             return getInnerClassName();
1286         }
1287 
1288         String name = getName();
1289         int dot = name.lastIndexOf('.');
1290         if (dot != -1) {
1291             return name.substring(dot + 1);
1292         }
1293 
1294         return name;
1295     }
1296 
1297     /**
1298      * Returns the simple name of a member or local class, or null otherwise.
1299      */
getInnerClassName()1300     private String getInnerClassName() {
1301         return AnnotationAccess.getInnerClassName(this);
1302     }
1303 
1304     /**
1305      * Returns null.
1306      */
getProtectionDomain()1307     public ProtectionDomain getProtectionDomain() {
1308         return null;
1309     }
1310 
1311     /**
1312      * Returns the URL of the given resource, or null if the resource is not found.
1313      * The mapping between the resource name and the URL is managed by the class' class loader.
1314      *
1315      * @see ClassLoader
1316      */
getResource(String resourceName)1317     public URL getResource(String resourceName) {
1318         // Get absolute resource name, but without the leading slash
1319         if (resourceName.startsWith("/")) {
1320             resourceName = resourceName.substring(1);
1321         } else {
1322             String pkg = getName();
1323             int dot = pkg.lastIndexOf('.');
1324             if (dot != -1) {
1325                 pkg = pkg.substring(0, dot).replace('.', '/');
1326             } else {
1327                 pkg = "";
1328             }
1329 
1330             resourceName = pkg + "/" + resourceName;
1331         }
1332 
1333         // Delegate to proper class loader
1334         ClassLoader loader = getClassLoader();
1335         if (loader != null) {
1336             return loader.getResource(resourceName);
1337         } else {
1338             return ClassLoader.getSystemResource(resourceName);
1339         }
1340     }
1341 
1342     /**
1343      * Returns a read-only stream for the contents of the given resource, or null if the resource
1344      * is not found.
1345      * The mapping between the resource name and the stream is managed by the class' class loader.
1346      *
1347      * @see ClassLoader
1348      */
getResourceAsStream(String resourceName)1349     public InputStream getResourceAsStream(String resourceName) {
1350         // Get absolute resource name, but without the leading slash
1351         if (resourceName.startsWith("/")) {
1352             resourceName = resourceName.substring(1);
1353         } else {
1354             String pkg = getName();
1355             int dot = pkg.lastIndexOf('.');
1356             if (dot != -1) {
1357                 pkg = pkg.substring(0, dot).replace('.', '/');
1358             } else {
1359                 pkg = "";
1360             }
1361 
1362             resourceName = pkg + "/" + resourceName;
1363         }
1364 
1365         // Delegate to proper class loader
1366         ClassLoader loader = getClassLoader();
1367         if (loader != null) {
1368             return loader.getResourceAsStream(resourceName);
1369         } else {
1370             return ClassLoader.getSystemResourceAsStream(resourceName);
1371         }
1372     }
1373 
1374     /**
1375      * Returns null. (On Android, a {@code ClassLoader} can load classes from multiple dex files.
1376      * All classes from any given dex file will have the same signers, but different dex
1377      * files may have different signers. This does not fit well with the original
1378      * {@code ClassLoader}-based model of {@code getSigners}.)
1379      */
getSigners()1380     public Object[] getSigners() {
1381         // See http://code.google.com/p/android/issues/detail?id=1766.
1382         return null;
1383     }
1384 
1385     /**
1386      * Returns the {@code Class} object which represents the superclass of the
1387      * class represented by this {@code Class}. If this {@code Class} represents
1388      * the {@code Object} class, a primitive type, an interface or void then the
1389      * method returns {@code null}. If this {@code Class} represents an array
1390      * class then the {@code Object} class is returned.
1391      */
getSuperclass()1392     public Class<? super T> getSuperclass() {
1393       // For interfaces superClass is Object (which agrees with the JNI spec)
1394       // but not with the expected behavior here.
1395       if (isInterface()) {
1396         return null;
1397       } else {
1398         return superClass;
1399       }
1400     }
1401 
1402     /**
1403      * Returns an array containing {@code TypeVariable} objects for type
1404      * variables declared by the generic class represented by this {@code
1405      * Class}. Returns an empty array if the class is not generic.
1406      */
1407     @SuppressWarnings("unchecked")
getTypeParameters()1408     @Override public synchronized TypeVariable<Class<T>>[] getTypeParameters() {
1409         String annotationSignature = AnnotationAccess.getSignature(this);
1410         if (annotationSignature == null) {
1411             return EmptyArray.TYPE_VARIABLE;
1412         }
1413         GenericSignatureParser parser = new GenericSignatureParser(getClassLoader());
1414         parser.parseForClass(this, annotationSignature);
1415         return parser.formalTypeParameters;
1416     }
1417 
1418     /**
1419      * Tests whether this {@code Class} represents an annotation class.
1420      */
isAnnotation()1421     public boolean isAnnotation() {
1422         final int ACC_ANNOTATION = 0x2000;  // not public in reflect.Modifier
1423         return (accessFlags & ACC_ANNOTATION) != 0;
1424     }
1425 
isAnnotationPresent(Class<? extends Annotation> annotationType)1426     @Override public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
1427         return AnnotationAccess.isAnnotationPresent(this, annotationType);
1428     }
1429 
1430     /**
1431      * Tests whether the class represented by this {@code Class} is
1432      * anonymous.
1433      */
isAnonymousClass()1434     public boolean isAnonymousClass() {
1435         return AnnotationAccess.isAnonymousClass(this);
1436     }
1437 
1438     /**
1439      * Tests whether the class represented by this {@code Class} is an array class.
1440      */
isArray()1441     public boolean isArray() {
1442         return getComponentType() != null;
1443     }
1444 
1445     /**
1446      * Is this a runtime created proxy class?
1447      *
1448      * @hide
1449      */
isProxy()1450     public boolean isProxy() {
1451         return (accessFlags & 0x00040000) != 0;
1452     }
1453 
1454     /**
1455      * Can {@code c}  be assigned to this class? For example, String can be assigned to Object
1456      * (by an upcast), however, an Object cannot be assigned to a String as a potentially exception
1457      * throwing downcast would be necessary. Similarly for interfaces, a class that implements (or
1458      * an interface that extends) another can be assigned to its parent, but not vice-versa. All
1459      * Classes may assign to themselves. Classes for primitive types may not assign to each other.
1460      *
1461      * @param c the class to check.
1462      * @return {@code true} if {@code c} can be assigned to the class
1463      *         represented by this {@code Class}; {@code false} otherwise.
1464      * @throws NullPointerException if {@code c} is {@code null}.
1465      */
isAssignableFrom(Class<?> c)1466     public boolean isAssignableFrom(Class<?> c) {
1467         if (this == c) {
1468             return true;  // Can always assign to things of the same type.
1469         } else if (this == Object.class) {
1470             return !c.isPrimitive();  // Can assign any reference to java.lang.Object.
1471         } else if (isArray()) {
1472             return c.isArray() && componentType.isAssignableFrom(c.componentType);
1473         } else if (isInterface()) {
1474             // Search iftable which has a flattened and uniqued list of interfaces.
1475             Object[] iftable = c.ifTable;
1476             if (iftable != null) {
1477                 for (int i = 0; i < iftable.length; i += 2) {
1478                     Class<?> ifc = (Class<?>) iftable[i];
1479                     if (ifc == this) {
1480                         return true;
1481                     }
1482                 }
1483             }
1484             return false;
1485         } else {
1486             if (!c.isInterface()) {
1487                 for (c = c.superClass; c != null; c = c.superClass) {
1488                     if (c == this) {
1489                         return true;
1490                     }
1491                 }
1492             }
1493             return false;
1494         }
1495     }
1496 
1497     /**
1498      * Tests whether the class represented by this {@code Class} is an
1499      * {@code enum}.
1500      */
isEnum()1501     public boolean isEnum() {
1502         return (getSuperclass() == Enum.class) && ((accessFlags & 0x4000) != 0);
1503     }
1504 
1505     /**
1506      * Tests whether the given object can be cast to the class
1507      * represented by this {@code Class}. This is the runtime version of the
1508      * {@code instanceof} operator.
1509      *
1510      * @return {@code true} if {@code object} can be cast to the type
1511      *         represented by this {@code Class}; {@code false} if {@code
1512      *         object} is {@code null} or cannot be cast.
1513      */
isInstance(Object object)1514     public boolean isInstance(Object object) {
1515         if (object == null) {
1516             return false;
1517         }
1518         return isAssignableFrom(object.getClass());
1519     }
1520 
1521     /**
1522      * Tests whether this {@code Class} represents an interface.
1523      */
isInterface()1524     public boolean isInterface() {
1525       return (accessFlags & Modifier.INTERFACE) != 0;
1526     }
1527 
1528     /**
1529      * Tests whether the class represented by this {@code Class} is defined
1530      * locally.
1531      */
isLocalClass()1532     public boolean isLocalClass() {
1533         return !classNameImpliesTopLevel()
1534                 && AnnotationAccess.getEnclosingMethodOrConstructor(this) != null
1535                 && !isAnonymousClass();
1536     }
1537 
1538     /**
1539      * Tests whether the class represented by this {@code Class} is a member
1540      * class.
1541      */
isMemberClass()1542     public boolean isMemberClass() {
1543         return getDeclaringClass() != null;
1544     }
1545 
1546     /**
1547      * Tests whether this {@code Class} represents a primitive type.
1548      */
isPrimitive()1549     public boolean isPrimitive() {
1550       return primitiveType != 0;
1551     }
1552 
1553     /**
1554      * Tests whether this {@code Class} represents a synthetic type.
1555      */
isSynthetic()1556     public boolean isSynthetic() {
1557         final int ACC_SYNTHETIC = 0x1000;   // not public in reflect.Modifier
1558         return (accessFlags & ACC_SYNTHETIC) != 0;
1559     }
1560 
1561     /**
1562      * Indicates whether this {@code Class} or its parents override finalize.
1563      *
1564      * @hide
1565      */
isFinalizable()1566     public boolean isFinalizable() {
1567       final int ACC_CLASS_IS_FINALIZABLE = 0x80000000;  // not public in reflect.Modifier
1568       return (accessFlags & ACC_CLASS_IS_FINALIZABLE) != 0;
1569     }
1570 
1571     /**
1572      * Returns a new instance of the class represented by this {@code Class},
1573      * created by invoking the default (that is, zero-argument) constructor. If
1574      * there is no such constructor, or if the creation fails (either because of
1575      * a lack of available memory or because an exception is thrown by the
1576      * constructor), an {@code InstantiationException} is thrown. If the default
1577      * constructor exists but is not accessible from the context where this
1578      * method is invoked, an {@code IllegalAccessException} is thrown.
1579      *
1580      * @throws IllegalAccessException
1581      *             if the default constructor is not visible.
1582      * @throws InstantiationException
1583      *             if the instance cannot be created.
1584      */
newInstance()1585     public T newInstance() throws InstantiationException, IllegalAccessException {
1586         if (isPrimitive() || isInterface() || isArray() || Modifier.isAbstract(accessFlags)) {
1587             throw new InstantiationException(this + " cannot be instantiated");
1588         }
1589         Class<?> caller = VMStack.getStackClass1();
1590         if (!caller.canAccess(this)) {
1591           throw new IllegalAccessException(this + " is not accessible from " + caller);
1592         }
1593         Constructor<T> init;
1594         try {
1595             init = getDeclaredConstructor();
1596         } catch (NoSuchMethodException e) {
1597             InstantiationException t =
1598                 new InstantiationException(this + " has no zero argument constructor");
1599             t.initCause(e);
1600             throw t;
1601         }
1602         if (!caller.canAccessMember(this, init.getAccessFlags())) {
1603           throw new IllegalAccessException(init + " is not accessible from " + caller);
1604         }
1605         try {
1606           return init.newInstance(null, init.isAccessible());
1607         } catch (InvocationTargetException e) {
1608           SneakyThrow.sneakyThrow(e.getCause());
1609           return null;  // Unreachable.
1610         }
1611     }
1612 
canAccess(Class<?> c)1613     private boolean canAccess(Class<?> c) {
1614         if(Modifier.isPublic(c.accessFlags)) {
1615             return true;
1616         }
1617         return inSamePackage(c);
1618     }
1619 
canAccessMember(Class<?> memberClass, int memberModifiers)1620     private boolean canAccessMember(Class<?> memberClass, int memberModifiers) {
1621         if (memberClass == this || Modifier.isPublic(memberModifiers)) {
1622             return true;
1623         }
1624         if (Modifier.isPrivate(memberModifiers)) {
1625             return false;
1626         }
1627         if (Modifier.isProtected(memberModifiers)) {
1628             for (Class<?> parent = this.superClass; parent != null; parent = parent.superClass) {
1629                 if (parent == memberClass) {
1630                     return true;
1631                 }
1632             }
1633         }
1634         return inSamePackage(memberClass);
1635     }
1636 
inSamePackage(Class<?> c)1637     private boolean inSamePackage(Class<?> c) {
1638         if (classLoader != c.classLoader) {
1639             return false;
1640         }
1641         String packageName1 = getPackageName$();
1642         String packageName2 = c.getPackageName$();
1643         if (packageName1 == null) {
1644             return packageName2 == null;
1645         } else if (packageName2 == null) {
1646             return false;
1647         } else {
1648             return packageName1.equals(packageName2);
1649         }
1650     }
1651 
1652     @Override
toString()1653     public String toString() {
1654         if (isPrimitive()) {
1655             return getSimpleName();
1656         } else {
1657             return (isInterface() ? "interface " : "class ") + getName();
1658         }
1659     }
1660 
1661     /**
1662      * Returns the {@code Package} of which the class represented by this
1663      * {@code Class} is a member. Returns {@code null} if no {@code Package}
1664      * object was created by the class loader of the class.
1665      */
getPackage()1666     public Package getPackage() {
1667         // TODO This might be a hack, but the VM doesn't have the necessary info.
1668         ClassLoader loader = getClassLoader();
1669         if (loader != null) {
1670             String packageName = getPackageName$();
1671             return packageName != null ? loader.getPackage(packageName) : null;
1672         }
1673         return null;
1674     }
1675 
1676     /**
1677      * Returns the package name of this class. This returns null for classes in
1678      * the default package.
1679      *
1680      * @hide
1681      */
getPackageName$()1682     public String getPackageName$() {
1683         String name = getName();
1684         int last = name.lastIndexOf('.');
1685         return last == -1 ? null : name.substring(0, last);
1686     }
1687 
1688     /**
1689      * Returns the assertion status for the class represented by this {@code
1690      * Class}. Assertion is enabled / disabled based on the class loader,
1691      * package or class default at runtime.
1692      */
desiredAssertionStatus()1693     public boolean desiredAssertionStatus() {
1694       return false;
1695     }
1696 
1697     /**
1698      * Casts this {@code Class} to represent a subclass of the given class.
1699      * If successful, this {@code Class} is returned; otherwise a {@code
1700      * ClassCastException} is thrown.
1701      *
1702      * @throws ClassCastException
1703      *             if this {@code Class} cannot be cast to the given type.
1704      */
1705     @SuppressWarnings("unchecked")
asSubclass(Class<U> c)1706     public <U> Class<? extends U> asSubclass(Class<U> c) {
1707         if (c.isAssignableFrom(this)) {
1708             return (Class<? extends U>)this;
1709         }
1710         String actualClassName = this.getName();
1711         String desiredClassName = c.getName();
1712         throw new ClassCastException(actualClassName + " cannot be cast to " + desiredClassName);
1713     }
1714 
1715     /**
1716      * Casts the given object to the type represented by this {@code Class}.
1717      * If the object is {@code null} then the result is also {@code null}.
1718      *
1719      * @throws ClassCastException
1720      *             if the object cannot be cast to the given type.
1721      */
1722     @SuppressWarnings("unchecked")
cast(Object obj)1723     public T cast(Object obj) {
1724         if (obj == null) {
1725             return null;
1726         } else if (this.isInstance(obj)) {
1727             return (T)obj;
1728         }
1729         String actualClassName = obj.getClass().getName();
1730         String desiredClassName = this.getName();
1731         throw new ClassCastException(actualClassName + " cannot be cast to " + desiredClassName);
1732     }
1733 
1734     /**
1735      * The class def of this class in its own Dex, or -1 if there is no class def.
1736      *
1737      * @hide
1738      */
getDexClassDefIndex()1739     public int getDexClassDefIndex() {
1740         return (dexClassDefIndex == 65535) ? -1 : dexClassDefIndex;
1741     }
1742 
1743     /**
1744      * The type index of this class in its own Dex, or -1 if it is unknown. If a class is referenced
1745      * by multiple Dex files, it will have a different type index in each. Dex files support 65534
1746      * type indices, with 65535 representing no index.
1747      *
1748      * @hide
1749      */
getDexTypeIndex()1750     public int getDexTypeIndex() {
1751         int typeIndex = dexTypeIndex;
1752         if (typeIndex != 65535) {
1753             return typeIndex;
1754         }
1755         synchronized (this) {
1756             typeIndex = dexTypeIndex;
1757             if (typeIndex == 65535) {
1758                 if (dexClassDefIndex >= 0) {
1759                     typeIndex = getDex().typeIndexFromClassDefIndex(dexClassDefIndex);
1760                 } else {
1761                     typeIndex = getDex().findTypeIndex(InternalNames.getInternalName(this));
1762                     if (typeIndex < 0) {
1763                         typeIndex = -1;
1764                     }
1765                 }
1766                 dexTypeIndex = typeIndex;
1767             }
1768         }
1769         return typeIndex;
1770     }
1771 
1772     /**
1773      * The annotation directory offset of this class in its own Dex, or 0 if it
1774      * is unknown.
1775      *
1776      * TODO: 0 is a sentinel that means 'no annotations directory'; this should be -1 if unknown
1777      *
1778      * @hide
1779      */
getDexAnnotationDirectoryOffset()1780     public int getDexAnnotationDirectoryOffset() {
1781         Dex dex = getDex();
1782         if (dex == null) {
1783             return 0;
1784         }
1785         int classDefIndex = getDexClassDefIndex();
1786         if (classDefIndex < 0) {
1787             return 0;
1788         }
1789         return dex.annotationDirectoryOffsetFromClassDefIndex(classDefIndex);
1790     }
1791 
1792     private static class Caches {
1793         /**
1794          * Cache to avoid frequent recalculation of generic interfaces, which is generally uncommon.
1795          * Sized sufficient to allow ConcurrentHashMapTest to run without recalculating its generic
1796          * interfaces (required to avoid time outs). Validated by running reflection heavy code
1797          * such as applications using Guice-like frameworks.
1798          */
1799         private static final BasicLruCache<Class, Type[]> genericInterfaces
1800             = new BasicLruCache<Class, Type[]>(8);
1801     }
1802 }
1803