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