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 dalvik.system.VMStack; 36 import java.io.InputStream; 37 import java.io.Serializable; 38 import java.lang.annotation.Annotation; 39 import java.lang.annotation.Inherited; 40 import java.lang.reflect.AnnotatedElement; 41 import java.lang.reflect.Constructor; 42 import java.lang.reflect.Field; 43 import java.lang.reflect.GenericDeclaration; 44 import java.lang.reflect.Member; 45 import java.lang.reflect.Method; 46 import java.lang.reflect.Modifier; 47 import java.lang.reflect.Type; 48 import java.lang.reflect.TypeVariable; 49 import java.net.URL; 50 import java.security.ProtectionDomain; 51 import java.util.ArrayList; 52 import java.util.Arrays; 53 import java.util.Collection; 54 import java.util.HashMap; 55 import java.util.List; 56 import libcore.util.CollectionUtils; 57 import libcore.util.EmptyArray; 58 import org.apache.harmony.kernel.vm.StringUtils; 59 import org.apache.harmony.luni.lang.reflect.GenericSignatureParser; 60 import org.apache.harmony.luni.lang.reflect.Types; 61 62 /** 63 * The in-memory representation of a Java class. This representation serves as 64 * the starting point for querying class-related information, a process usually 65 * called "reflection". There are basically three types of {@code Class} 66 * instances: those representing real classes and interfaces, those representing 67 * primitive types, and those representing array classes. 68 * 69 * <h4>Class instances representing object types (classes or interfaces)</h4> 70 * <p> 71 * These represent an ordinary class or interface as found in the class 72 * hierarchy. The name associated with these {@code Class} instances is simply 73 * the fully qualified class name of the class or interface that it represents. 74 * In addition to this human-readable name, each class is also associated by a 75 * so-called <em>signature</em>, which is the letter "L", followed by the 76 * class name and a semicolon (";"). The signature is what the runtime system 77 * uses internally for identifying the class (for example in a DEX file). 78 * </p> 79 * <h4>Classes representing primitive types</h4> 80 * <p> 81 * These represent the standard Java primitive types and hence share their 82 * names (for example "int" for the {@code int} primitive type). Although it is 83 * not possible to create new instances based on these {@code Class} instances, 84 * they are still useful for providing reflection information, and as the 85 * component type of array classes. There is one {@code Class} instance for each 86 * primitive type, and their signatures are: 87 * </p> 88 * <ul> 89 * <li>{@code B} representing the {@code byte} primitive type</li> 90 * <li>{@code S} representing the {@code short} primitive type</li> 91 * <li>{@code I} representing the {@code int} primitive type</li> 92 * <li>{@code J} representing the {@code long} primitive type</li> 93 * <li>{@code F} representing the {@code float} primitive type</li> 94 * <li>{@code D} representing the {@code double} primitive type</li> 95 * <li>{@code C} representing the {@code char} primitive type</li> 96 * <li>{@code Z} representing the {@code boolean} primitive type</li> 97 * <li>{@code V} representing void function return values</li> 98 * </ul> 99 * <p> 100 * <h4>Classes representing array classes</h4> 101 * <p> 102 * These represent the classes of Java arrays. There is one such {@code Class} 103 * instance per combination of array leaf component type and arity (number of 104 * dimensions). In this case, the name associated with the {@code Class} 105 * consists of one or more left square brackets (one per dimension in the array) 106 * followed by the signature of the class representing the leaf component type, 107 * which can be either an object type or a primitive type. The signature of a 108 * {@code Class} representing an array type is the same as its name. Examples 109 * of array class signatures are: 110 * </p> 111 * <ul> 112 * <li>{@code [I} representing the {@code int[]} type</li> 113 * <li>{@code [Ljava/lang/String;} representing the {@code String[]} type</li> 114 * <li>{@code [[[C} representing the {@code char[][][]} type (three dimensions!)</li> 115 * </ul> 116 */ 117 public final class Class<T> implements Serializable, AnnotatedElement, GenericDeclaration, Type { 118 119 private static final long serialVersionUID = 3206093459760846163L; 120 121 /** 122 * Lazily computed name of this class; always prefer calling getName(). 123 */ 124 private transient String name; 125 126 private Class() { 127 // Prevent this class to be instantiated, instance 128 // should be created by JVM only 129 } 130 131 /** 132 * Get the Signature attribute for this class. Returns null if not found. 133 */ 134 private String getSignatureAttribute() { 135 Object[] annotation = getSignatureAnnotation(); 136 137 if (annotation == null) { 138 return null; 139 } 140 141 return StringUtils.combineStrings(annotation); 142 } 143 144 /** 145 * Get the Signature annotation for this class. Returns null if not found. 146 */ 147 native private Object[] getSignatureAnnotation(); 148 149 /** 150 * Returns a {@code Class} object which represents the class with the 151 * specified name. The name should be the name of a class as described in 152 * the {@link Class class definition}; however, {@code Class}es representing 153 * primitive types can not be found using this method. 154 * <p> 155 * If the class has not been loaded so far, it is being loaded and linked 156 * first. This is done through either the class loader of the calling class 157 * or one of its parent class loaders. The class is also being initialized, 158 * which means that a possible static initializer block is executed. 159 * 160 * @param className 161 * the name of the non-primitive-type class to find. 162 * @return the named {@code Class} instance. 163 * @throws ClassNotFoundException 164 * if the requested class can not be found. 165 * @throws LinkageError 166 * if an error occurs during linkage 167 * @throws ExceptionInInitializerError 168 * if an exception occurs during static initialization of a 169 * class. 170 */ 171 public static Class<?> forName(String className) throws ClassNotFoundException { 172 return forName(className, true, VMStack.getCallingClassLoader()); 173 } 174 175 /** 176 * Returns a {@code Class} object which represents the class with the 177 * specified name. The name should be the name of a class as described in 178 * the {@link Class class definition}, however {@code Class}es representing 179 * primitive types can not be found using this method. Security rules will 180 * be obeyed. 181 * <p> 182 * If the class has not been loaded so far, it is being loaded and linked 183 * first. This is done through either the specified class loader or one of 184 * its parent class loaders. The caller can also request the class to be 185 * initialized, which means that a possible static initializer block is 186 * executed. 187 * 188 * @param className 189 * the name of the non-primitive-type class to find. 190 * @param initializeBoolean 191 * indicates whether the class should be initialized. 192 * @param classLoader 193 * the class loader to use to load the class. 194 * @return the named {@code Class} instance. 195 * @throws ClassNotFoundException 196 * if the requested class can not be found. 197 * @throws LinkageError 198 * if an error occurs during linkage 199 * @throws ExceptionInInitializerError 200 * if an exception occurs during static initialization of a 201 * class. 202 */ 203 public static Class<?> forName(String className, boolean initializeBoolean, 204 ClassLoader classLoader) throws ClassNotFoundException { 205 206 if (classLoader == null) { 207 classLoader = ClassLoader.getSystemClassLoader(); 208 } 209 // Catch an Exception thrown by the underlying native code. It wraps 210 // up everything inside a ClassNotFoundException, even if e.g. an 211 // Error occurred during initialization. This as a workaround for 212 // an ExceptionInInitilaizerError that's also wrapped. It is actually 213 // expected to be thrown. Maybe the same goes for other errors. 214 // Not wrapping up all the errors will break android though. 215 Class<?> result; 216 try { 217 result = classForName(className, initializeBoolean, 218 classLoader); 219 } catch (ClassNotFoundException e) { 220 Throwable cause = e.getCause(); 221 if (cause instanceof ExceptionInInitializerError) { 222 throw (ExceptionInInitializerError) cause; 223 } 224 throw e; 225 } 226 return result; 227 } 228 229 /* 230 * Returns a class by name without any security checks. 231 * 232 * @param className The name of the non-primitive type class to find 233 * @param initializeBoolean A boolean indicating whether the class should be 234 * initialized 235 * @param classLoader The class loader to use to load the class 236 * @return the named class. 237 * @throws ClassNotFoundException If the class could not be found 238 */ 239 static native Class<?> classForName(String className, boolean initializeBoolean, 240 ClassLoader classLoader) throws ClassNotFoundException; 241 242 /** 243 * Returns an array containing {@code Class} objects for all public classes 244 * and interfaces that are members of this class. This includes public 245 * members inherited from super classes and interfaces. If there are no such 246 * class members or if this object represents a primitive type then an array 247 * of length 0 is returned. 248 * 249 * @return the public class members of the class represented by this object. 250 */ 251 public Class<?>[] getClasses() { 252 return getFullListOfClasses(true); 253 } 254 255 @Override public <A extends Annotation> A getAnnotation(Class<A> annotationType) { 256 if (annotationType == null) { 257 throw new NullPointerException("annotationType == null"); 258 } 259 260 A annotation = getDeclaredAnnotation(annotationType); 261 if (annotation != null) { 262 return annotation; 263 } 264 265 if (annotationType.isAnnotationPresent(Inherited.class)) { 266 for (Class<?> sup = getSuperclass(); sup != null; sup = sup.getSuperclass()) { 267 annotation = sup.getDeclaredAnnotation(annotationType); 268 if (annotation != null) { 269 return annotation; 270 } 271 } 272 } 273 274 return null; 275 } 276 277 /** 278 * Returns all the annotations of this class. If there are no annotations 279 * then an empty array is returned. 280 * 281 * @return a copy of the array containing this class' annotations. 282 * @see #getDeclaredAnnotations() 283 */ 284 public Annotation[] getAnnotations() { 285 /* 286 * We need to get the annotations declared on this class, plus the 287 * annotations from superclasses that have the "@Inherited" annotation 288 * set. We create a temporary map to use while we accumulate the 289 * annotations and convert it to an array at the end. 290 * 291 * It's possible to have duplicates when annotations are inherited. 292 * We use a Map to filter those out. 293 * 294 * HashMap might be overkill here. 295 */ 296 HashMap<Class, Annotation> map = new HashMap<Class, Annotation>(); 297 Annotation[] declaredAnnotations = getDeclaredAnnotations(); 298 299 for (int i = declaredAnnotations.length-1; i >= 0; --i) { 300 map.put(declaredAnnotations[i].annotationType(), declaredAnnotations[i]); 301 } 302 for (Class<?> sup = getSuperclass(); sup != null; sup = sup.getSuperclass()) { 303 declaredAnnotations = sup.getDeclaredAnnotations(); 304 for (int i = declaredAnnotations.length-1; i >= 0; --i) { 305 Class<?> clazz = declaredAnnotations[i].annotationType(); 306 if (!map.containsKey(clazz) && clazz.isAnnotationPresent(Inherited.class)) { 307 map.put(clazz, declaredAnnotations[i]); 308 } 309 } 310 } 311 312 /* convert annotation values from HashMap to array */ 313 Collection<Annotation> coll = map.values(); 314 return coll.toArray(new Annotation[coll.size()]); 315 } 316 317 /** 318 * Returns the canonical name of this class. If this class does not have a 319 * canonical name as defined in the Java Language Specification, then the 320 * method returns {@code null}. 321 * 322 * @return this class' canonical name, or {@code null} if it does not have a 323 * canonical name. 324 */ 325 public String getCanonicalName() { 326 if (isLocalClass() || isAnonymousClass()) 327 return null; 328 329 if (isArray()) { 330 /* 331 * The canonical name of an array type depends on the (existence of) 332 * the component type's canonical name. 333 */ 334 String name = getComponentType().getCanonicalName(); 335 if (name != null) { 336 return name + "[]"; 337 } 338 } else if (isMemberClass()) { 339 /* 340 * The canonical name of an inner class depends on the (existence 341 * of) the declaring class' canonical name. 342 */ 343 String name = getDeclaringClass().getCanonicalName(); 344 if (name != null) { 345 return name + "." + getSimpleName(); 346 } 347 } else { 348 /* 349 * The canonical name of a top-level class or primitive type is 350 * equal to the fully qualified name. 351 */ 352 return getName(); 353 } 354 355 /* 356 * Other classes don't have a canonical name. 357 */ 358 return null; 359 } 360 361 /** 362 * Returns the class loader which was used to load the class represented by 363 * this {@code Class}. Implementations are free to return {@code null} for 364 * classes that were loaded by the bootstrap class loader. The Android 365 * reference implementation, though, returns a reference to an actual 366 * representation of the bootstrap class loader. 367 * 368 * @return the class loader for the represented class. 369 * @see ClassLoader 370 */ 371 public ClassLoader getClassLoader() { 372 if (this.isPrimitive()) { 373 return null; 374 } 375 376 ClassLoader loader = getClassLoaderImpl(); 377 if (loader == null) { 378 loader = BootClassLoader.getInstance(); 379 } 380 return loader; 381 } 382 383 /** 384 * This must be provided by the VM vendor, as it is used by other provided 385 * class implementations in this package. Outside of this class, it is used 386 * by SecurityManager.classLoaderDepth(), 387 * currentClassLoader() and currentLoadedClass(). Return the ClassLoader for 388 * this Class without doing any security checks. The bootstrap ClassLoader 389 * is returned, unlike getClassLoader() which returns null in place of the 390 * bootstrap ClassLoader. 391 * 392 * @return the ClassLoader 393 */ 394 ClassLoader getClassLoaderImpl() { 395 ClassLoader loader = getClassLoader(this); 396 return loader == null ? BootClassLoader.getInstance() : loader; 397 } 398 399 /* 400 * Returns the defining class loader for the given class. 401 * 402 * @param clazz the class the class loader of which we want 403 * @return the class loader 404 */ 405 private static native ClassLoader getClassLoader(Class<?> clazz); 406 407 /** 408 * Returns a {@code Class} object which represents the component type if 409 * this class represents an array type. Returns {@code null} if this class 410 * does not represent an array type. The component type of an array type is 411 * the type of the elements of the array. 412 * 413 * @return the component type of this class. 414 */ 415 public native Class<?> getComponentType(); 416 417 /** 418 * Returns a {@code Constructor} object which represents the public 419 * constructor matching the specified parameter types. 420 * 421 * @param parameterTypes 422 * the parameter types of the requested constructor. 423 * {@code (Class[]) null} is equivalent to the empty array. 424 * @return the constructor described by {@code parameterTypes}. 425 * @throws NoSuchMethodException 426 * if the constructor can not be found. 427 * @see #getDeclaredConstructor(Class[]) 428 */ 429 @SuppressWarnings("unchecked") 430 public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException { 431 return (Constructor) getConstructorOrMethod("<init>", false, true, parameterTypes); 432 } 433 434 /** 435 * Returns a constructor or method with the specified name. 436 * 437 * @param name the method name, or "<init>" to return a constructor. 438 * @param recursive true to search supertypes. 439 */ 440 private Member getConstructorOrMethod(String name, boolean recursive, 441 boolean publicOnly, Class<?>[] parameterTypes) throws NoSuchMethodException { 442 if (recursive && !publicOnly) { 443 throw new AssertionError(); // can't lookup non-public members recursively 444 } 445 if (name == null) { 446 throw new NullPointerException("name == null"); 447 } 448 if (parameterTypes == null) { 449 parameterTypes = EmptyArray.CLASS; 450 } 451 for (Class<?> c : parameterTypes) { 452 if (c == null) { 453 throw new NoSuchMethodException("parameter type is null"); 454 } 455 } 456 Member result = recursive 457 ? getPublicConstructorOrMethodRecursive(name, parameterTypes) 458 : Class.getDeclaredConstructorOrMethod(this, name, parameterTypes); 459 if (result == null || publicOnly && (result.getModifiers() & Modifier.PUBLIC) == 0) { 460 throw new NoSuchMethodException(name + " " + Arrays.toString(parameterTypes)); 461 } 462 return result; 463 } 464 465 private Member getPublicConstructorOrMethodRecursive(String name, Class<?>[] parameterTypes) { 466 // search superclasses 467 for (Class<?> c = this; c != null; c = c.getSuperclass()) { 468 Member result = Class.getDeclaredConstructorOrMethod(c, name, parameterTypes); 469 if (result != null && (result.getModifiers() & Modifier.PUBLIC) != 0) { 470 return result; 471 } 472 } 473 474 // search implemented interfaces 475 for (Class<?> c = this; c != null; c = c.getSuperclass()) { 476 for (Class<?> ifc : c.getInterfaces()) { 477 Member result = ifc.getPublicConstructorOrMethodRecursive(name, parameterTypes); 478 if (result != null && (result.getModifiers() & Modifier.PUBLIC) != 0) { 479 return result; 480 } 481 } 482 } 483 484 return null; 485 } 486 487 /** 488 * Returns an array containing {@code Constructor} objects for all public 489 * constructors for the class represented by this {@code Class}. If there 490 * are no public constructors or if this {@code Class} represents an array 491 * class, a primitive type or void then an empty array is returned. 492 * 493 * @return an array with the public constructors of the class represented by 494 * this {@code Class}. 495 * @see #getDeclaredConstructors() 496 */ 497 public Constructor<?>[] getConstructors() { 498 return getDeclaredConstructors(this, true); 499 } 500 501 /** 502 * Returns the annotations that are directly defined on the class 503 * represented by this {@code Class}. Annotations that are inherited are not 504 * included in the result. If there are no annotations at all, an empty 505 * array is returned. 506 * 507 * @return a copy of the array containing the annotations defined for the 508 * class that this {@code Class} represents. 509 * @see #getAnnotations() 510 */ 511 native public Annotation[] getDeclaredAnnotations(); 512 513 /** 514 * Returns the annotation if it exists. 515 */ 516 native private <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass); 517 518 /** 519 * Returns true if the annotation exists. 520 */ 521 native private boolean isDeclaredAnnotationPresent(Class<? extends Annotation> annotationClass); 522 523 /** 524 * Returns an array containing {@code Class} objects for all classes and 525 * interfaces that are declared as members of the class which this {@code 526 * Class} represents. If there are no classes or interfaces declared or if 527 * this class represents an array class, a primitive type or void, then an 528 * empty array is returned. 529 * 530 * @return an array with {@code Class} objects for all the classes and 531 * interfaces that are used in member declarations. 532 */ 533 public Class<?>[] getDeclaredClasses() { 534 return getDeclaredClasses(this, false); 535 } 536 537 /* 538 * Returns the list of member classes without performing any security checks 539 * first. This includes the member classes inherited from superclasses. If no 540 * member classes exist at all, an empty array is returned. 541 * 542 * @param publicOnly reflects whether we want only public members or all of them 543 * @return the list of classes 544 */ 545 private Class<?>[] getFullListOfClasses(boolean publicOnly) { 546 Class<?>[] result = getDeclaredClasses(this, publicOnly); 547 548 // Traverse all superclasses 549 Class<?> clazz = this.getSuperclass(); 550 while (clazz != null) { 551 Class<?>[] temp = getDeclaredClasses(clazz, publicOnly); 552 if (temp.length != 0) { 553 result = arraycopy(new Class[result.length + temp.length], result, temp); 554 } 555 556 clazz = clazz.getSuperclass(); 557 } 558 559 return result; 560 } 561 562 /* 563 * Returns the list of member classes of the given class. No security checks 564 * are performed. If no members exist, an empty array is returned. 565 * 566 * @param clazz the class the members of which we want 567 * @param publicOnly reflects whether we want only public member or all of them 568 * @return the class' class members 569 */ 570 private static native Class<?>[] getDeclaredClasses(Class<?> clazz, boolean publicOnly); 571 572 /** 573 * Returns a {@code Constructor} object which represents the constructor 574 * matching the specified parameter types that is declared by the class 575 * represented by this {@code Class}. 576 * 577 * @param parameterTypes 578 * the parameter types of the requested constructor. 579 * {@code (Class[]) null} is equivalent to the empty array. 580 * @return the constructor described by {@code parameterTypes}. 581 * @throws NoSuchMethodException 582 * if the requested constructor can not be found. 583 * @see #getConstructor(Class[]) 584 */ 585 @SuppressWarnings("unchecked") 586 public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 587 throws NoSuchMethodException { 588 return (Constructor) getConstructorOrMethod("<init>", false, false, parameterTypes); 589 } 590 591 /** 592 * Returns an array containing {@code Constructor} objects for all 593 * constructors declared in the class represented by this {@code Class}. If 594 * there are no constructors or if this {@code Class} represents an array 595 * class, a primitive type or void then an empty array is returned. 596 * 597 * @return an array with the constructors declared in the class represented 598 * by this {@code Class}. 599 * @see #getConstructors() 600 */ 601 public Constructor<?>[] getDeclaredConstructors() { 602 return getDeclaredConstructors(this, false); 603 } 604 605 /* 606 * Returns the list of constructors without performing any security checks 607 * first. If no constructors exist, an empty array is returned. 608 * 609 * @param clazz the class of interest 610 * @param publicOnly reflects whether we want only public constructors or all of them 611 * @return the list of constructors 612 */ 613 private static native <T> Constructor<T>[] getDeclaredConstructors( 614 Class<T> clazz, boolean publicOnly); 615 616 /** 617 * Returns a {@code Field} object for the field with the specified name 618 * which is declared in the class represented by this {@code Class}. 619 * 620 * @param name the name of the requested field. 621 * @return the requested field in the class represented by this class. 622 * @throws NoSuchFieldException if the requested field can not be found. 623 * @see #getField(String) 624 */ 625 public Field getDeclaredField(String name) throws NoSuchFieldException { 626 if (name == null) { 627 throw new NullPointerException("name == null"); 628 } 629 Field result = getDeclaredField(this, name); 630 if (result == null) { 631 throw new NoSuchFieldException(name); 632 } 633 return result; 634 } 635 636 /** 637 * Returns an array containing {@code Field} objects for all fields declared 638 * in the class represented by this {@code Class}. If there are no fields or 639 * if this {@code Class} represents an array class, a primitive type or void 640 * then an empty array is returned. 641 * 642 * @return an array with the fields declared in the class represented by 643 * this class. 644 * @see #getFields() 645 */ 646 public Field[] getDeclaredFields() { 647 return getDeclaredFields(this, false); 648 } 649 650 /* 651 * Returns the list of fields without performing any security checks 652 * first. If no fields exist at all, an empty array is returned. 653 * 654 * @param clazz the class of interest 655 * @param publicOnly reflects whether we want only public fields or all of them 656 * @return the list of fields 657 */ 658 static native Field[] getDeclaredFields(Class<?> clazz, boolean publicOnly); 659 660 /** 661 * Returns the field if it is defined by {@code clazz}; null otherwise. This 662 * may return a non-public member. 663 */ 664 static native Field getDeclaredField(Class<?> clazz, String name); 665 666 /** 667 * Returns a {@code Method} object which represents the method matching the 668 * specified name and parameter types that is declared by the class 669 * represented by this {@code Class}. 670 * 671 * @param name 672 * the requested method's name. 673 * @param parameterTypes 674 * the parameter types of the requested method. 675 * {@code (Class[]) null} is equivalent to the empty array. 676 * @return the method described by {@code name} and {@code parameterTypes}. 677 * @throws NoSuchMethodException 678 * if the requested constructor can not be found. 679 * @throws NullPointerException 680 * if {@code name} is {@code null}. 681 * @see #getMethod(String, Class[]) 682 */ 683 public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 684 throws NoSuchMethodException { 685 Member member = getConstructorOrMethod(name, false, false, parameterTypes); 686 if (member instanceof Constructor) { 687 throw new NoSuchMethodException(name); 688 } 689 return (Method) member; 690 } 691 692 /** 693 * Returns an array containing {@code Method} objects for all methods 694 * declared in the class represented by this {@code Class}. If there are no 695 * methods or if this {@code Class} represents an array class, a primitive 696 * type or void then an empty array is returned. 697 * 698 * @return an array with the methods declared in the class represented by 699 * this {@code Class}. 700 * @see #getMethods() 701 */ 702 public Method[] getDeclaredMethods() { 703 return getDeclaredMethods(this, false); 704 } 705 706 /** 707 * Returns the list of methods without performing any security checks 708 * first. If no methods exist, an empty array is returned. 709 */ 710 static native Method[] getDeclaredMethods(Class<?> clazz, boolean publicOnly); 711 712 /** 713 * Returns the constructor or method if it is defined by {@code clazz}; null 714 * otherwise. This may return a non-public member. 715 * 716 * @param name the method name, or "<init>" to get a constructor. 717 */ 718 static native Member getDeclaredConstructorOrMethod(Class clazz, String name, Class[] args); 719 720 /** 721 * Returns the declaring {@code Class} of this {@code Class}. Returns 722 * {@code null} if the class is not a member of another class or if this 723 * {@code Class} represents an array class, a primitive type or void. 724 * 725 * @return the declaring {@code Class} or {@code null}. 726 */ 727 native public Class<?> getDeclaringClass(); 728 729 /** 730 * Returns the enclosing {@code Class} of this {@code Class}. If there is no 731 * enclosing class the method returns {@code null}. 732 * 733 * @return the enclosing {@code Class} or {@code null}. 734 */ 735 native public Class<?> getEnclosingClass(); 736 737 /** 738 * Gets the enclosing {@code Constructor} of this {@code Class}, if it is an 739 * anonymous or local/automatic class; otherwise {@code null}. 740 * 741 * @return the enclosing {@code Constructor} instance or {@code null}. 742 */ 743 native public Constructor<?> getEnclosingConstructor(); 744 745 /** 746 * Gets the enclosing {@code Method} of this {@code Class}, if it is an 747 * anonymous or local/automatic class; otherwise {@code null}. 748 * 749 * @return the enclosing {@code Method} instance or {@code null}. 750 */ 751 native public Method getEnclosingMethod(); 752 753 /** 754 * Gets the {@code enum} constants associated with this {@code Class}. 755 * Returns {@code null} if this {@code Class} does not represent an {@code 756 * enum} type. 757 * 758 * @return an array with the {@code enum} constants or {@code null}. 759 */ 760 @SuppressWarnings("unchecked") // we only cast after confirming that this class is an enum 761 public T[] getEnumConstants() { 762 if (!isEnum()) { 763 return null; 764 } 765 return (T[]) Enum.getSharedConstants((Class) this).clone(); 766 } 767 768 /** 769 * Returns a {@code Field} object which represents the public field with the 770 * specified name. This method first searches the class C represented by 771 * this {@code Class}, then the interfaces implemented by C and finally the 772 * superclasses of C. 773 * 774 * @param name 775 * the name of the requested field. 776 * @return the public field specified by {@code name}. 777 * @throws NoSuchFieldException 778 * if the field can not be found. 779 * @see #getDeclaredField(String) 780 */ 781 public Field getField(String name) throws NoSuchFieldException { 782 if (name == null) { 783 throw new NullPointerException("name == null"); 784 } 785 Field result = getPublicFieldRecursive(name); 786 if (result == null) { 787 throw new NoSuchFieldException(name); 788 } 789 return result; 790 } 791 792 private Field getPublicFieldRecursive(String name) { 793 // search superclasses 794 for (Class<?> c = this; c != null; c = c.getSuperclass()) { 795 Field result = Class.getDeclaredField(c, name); 796 if (result != null && (result.getModifiers() & Modifier.PUBLIC) != 0) { 797 return result; 798 } 799 } 800 801 // search implemented interfaces 802 for (Class<?> c = this; c != null; c = c.getSuperclass()) { 803 for (Class<?> ifc : c.getInterfaces()) { 804 Field result = ifc.getPublicFieldRecursive(name); 805 if (result != null && (result.getModifiers() & Modifier.PUBLIC) != 0) { 806 return result; 807 } 808 } 809 } 810 811 return null; 812 } 813 814 /** 815 * Returns an array containing {@code Field} objects for all public fields 816 * for the class C represented by this {@code Class}. Fields may be declared 817 * in C, the interfaces it implements or in the superclasses of C. The 818 * elements in the returned array are in no particular order. 819 * 820 * <p>If there are no public fields or if this class represents an array class, 821 * a primitive type or {@code void} then an empty array is returned. 822 * 823 * @return an array with the public fields of the class represented by this 824 * {@code Class}. 825 * @see #getDeclaredFields() 826 */ 827 public Field[] getFields() { 828 List<Field> fields = new ArrayList<Field>(); 829 getPublicFieldsRecursive(fields); 830 831 /* 832 * The result may include duplicates when clazz implements an interface 833 * through multiple paths. Remove those duplicates. 834 */ 835 CollectionUtils.removeDuplicates(fields, Field.ORDER_BY_NAME_AND_DECLARING_CLASS); 836 return fields.toArray(new Field[fields.size()]); 837 } 838 839 /** 840 * Populates {@code result} with public fields defined by this class, its 841 * superclasses, and all implemented interfaces. 842 */ 843 private void getPublicFieldsRecursive(List<Field> result) { 844 // search superclasses 845 for (Class<?> c = this; c != null; c = c.getSuperclass()) { 846 for (Field field : Class.getDeclaredFields(c, true)) { 847 result.add(field); 848 } 849 } 850 851 // search implemented interfaces 852 for (Class<?> c = this; c != null; c = c.getSuperclass()) { 853 for (Class<?> ifc : c.getInterfaces()) { 854 ifc.getPublicFieldsRecursive(result); 855 } 856 } 857 } 858 859 /** 860 * Gets the {@link Type}s of the interfaces that this {@code Class} directly 861 * implements. If the {@code Class} represents a primitive type or {@code 862 * void} then an empty array is returned. 863 * 864 * @return an array of {@link Type} instances directly implemented by the 865 * class represented by this {@code class}. 866 */ 867 public Type[] getGenericInterfaces() { 868 GenericSignatureParser parser = new GenericSignatureParser(getClassLoader()); 869 parser.parseForClass(this, getSignatureAttribute()); 870 return Types.getClonedTypeArray(parser.interfaceTypes); 871 } 872 873 /** 874 * Gets the {@code Type} that represents the superclass of this {@code 875 * class}. 876 * 877 * @return an instance of {@code Type} representing the superclass. 878 */ 879 public Type getGenericSuperclass() { 880 GenericSignatureParser parser = new GenericSignatureParser(getClassLoader()); 881 parser.parseForClass(this, getSignatureAttribute()); 882 return Types.getType(parser.superclassType); 883 } 884 885 /** 886 * Returns an array of {@code Class} objects that match the interfaces 887 * specified in the {@code implements} declaration of the class represented 888 * by this {@code Class}. The order of the elements in the array is 889 * identical to the order in the original class declaration. If the class 890 * does not implement any interfaces, an empty array is returned. 891 * 892 * @return an array with the interfaces of the class represented by this 893 * class. 894 */ 895 public native Class<?>[] getInterfaces(); 896 897 /** 898 * Returns a {@code Method} object which represents the public method with 899 * the specified name and parameter types. This method first searches the 900 * class C represented by this {@code Class}, then the superclasses of C and 901 * finally the interfaces implemented by C and finally the superclasses of C 902 * for a method with matching name. 903 * 904 * @param name 905 * the requested method's name. 906 * @param parameterTypes 907 * the parameter types of the requested method. 908 * {@code (Class[]) null} is equivalent to the empty array. 909 * @return the public field specified by {@code name}. 910 * @throws NoSuchMethodException 911 * if the method can not be found. 912 * @see #getDeclaredMethod(String, Class[]) 913 */ 914 public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException { 915 Member member = getConstructorOrMethod(name, true, true, parameterTypes); 916 if (member instanceof Constructor) { 917 throw new NoSuchMethodException(name); 918 } 919 return (Method) member; 920 } 921 922 /** 923 * Returns an array containing {@code Method} objects for all public methods 924 * for the class C represented by this {@code Class}. Methods may be 925 * declared in C, the interfaces it implements or in the superclasses of C. 926 * The elements in the returned array are in no particular order. 927 * <p> 928 * If there are no public methods or if this {@code Class} represents a 929 * primitive type or {@code void} then an empty array is returned. 930 * </p> 931 * 932 * @return an array with the methods of the class represented by this 933 * {@code Class}. 934 * @see #getDeclaredMethods() 935 */ 936 public Method[] getMethods() { 937 List<Method> methods = new ArrayList<Method>(); 938 getPublicMethodsRecursive(methods); 939 940 /* 941 * Remove methods defined by multiple types, preferring to keep methods 942 * declared by derived types. 943 */ 944 CollectionUtils.removeDuplicates(methods, Method.ORDER_BY_SIGNATURE); 945 return methods.toArray(new Method[methods.size()]); 946 } 947 948 /** 949 * Populates {@code result} with public methods defined by {@code clazz}, its 950 * superclasses, and all implemented interfaces, including overridden methods. 951 */ 952 private void getPublicMethodsRecursive(List<Method> result) { 953 // search superclasses 954 for (Class<?> c = this; c != null; c = c.getSuperclass()) { 955 for (Method method : Class.getDeclaredMethods(c, true)) { 956 result.add(method); 957 } 958 } 959 960 // search implemented interfaces 961 for (Class<?> c = this; c != null; c = c.getSuperclass()) { 962 for (Class<?> ifc : c.getInterfaces()) { 963 ifc.getPublicMethodsRecursive(result); 964 } 965 } 966 } 967 968 /** 969 * Returns an integer that represents the modifiers of the class represented 970 * by this {@code Class}. The returned value is a combination of bits 971 * defined by constants in the {@link Modifier} class. 972 * 973 * @return the modifiers of the class represented by this {@code Class}. 974 */ 975 public int getModifiers() { 976 return getModifiers(this, false); 977 } 978 979 /* 980 * Return the modifiers for the given class. 981 * 982 * @param clazz the class of interest 983 * @ignoreInnerClassesAttrib determines whether we look for and use the 984 * flags from an "inner class" attribute 985 */ 986 private static native int getModifiers(Class<?> clazz, boolean ignoreInnerClassesAttrib); 987 988 /** 989 * Returns the name of the class represented by this {@code Class}. For a 990 * description of the format which is used, see the class definition of 991 * {@link Class}. 992 * 993 * @return the name of the class represented by this {@code Class}. 994 */ 995 public String getName() { 996 String result = name; 997 return (result == null) ? (name = getNameNative()) : result; 998 } 999 1000 private native String getNameNative(); 1001 1002 /** 1003 * Returns the simple name of the class represented by this {@code Class} as 1004 * defined in the source code. If there is no name (that is, the class is 1005 * anonymous) then an empty string is returned. If the receiver is an array 1006 * then the name of the underlying type with square braces appended (for 1007 * example {@code "Integer[]"}) is returned. 1008 * 1009 * @return the simple name of the class represented by this {@code Class}. 1010 */ 1011 public String getSimpleName() { 1012 if (isArray()) { 1013 return getComponentType().getSimpleName() + "[]"; 1014 } 1015 1016 String name = getName(); 1017 1018 if (isAnonymousClass()) { 1019 return ""; 1020 } 1021 1022 if (isMemberClass() || isLocalClass()) { 1023 return getInnerClassName(); 1024 } 1025 1026 int dot = name.lastIndexOf('.'); 1027 if (dot != -1) { 1028 return name.substring(dot + 1); 1029 } 1030 1031 return name; 1032 } 1033 1034 /* 1035 * Returns the simple name of a member or local class, or null otherwise. 1036 * 1037 * @return The name. 1038 */ 1039 private native String getInnerClassName(); 1040 1041 /** 1042 * Returns null. 1043 */ 1044 public ProtectionDomain getProtectionDomain() { 1045 return null; 1046 } 1047 1048 /** 1049 * Returns the URL of the resource specified by {@code resName}. The mapping 1050 * between the resource name and the URL is managed by the class' class 1051 * loader. 1052 * 1053 * @param resName 1054 * the name of the resource. 1055 * @return the requested resource's {@code URL} object or {@code null} if 1056 * the resource can not be found. 1057 * @see ClassLoader 1058 */ 1059 public URL getResource(String resName) { 1060 // Get absolute resource name, but without the leading slash 1061 if (resName.startsWith("/")) { 1062 resName = resName.substring(1); 1063 } else { 1064 String pkg = getName(); 1065 int dot = pkg.lastIndexOf('.'); 1066 if (dot != -1) { 1067 pkg = pkg.substring(0, dot).replace('.', '/'); 1068 } else { 1069 pkg = ""; 1070 } 1071 1072 resName = pkg + "/" + resName; 1073 } 1074 1075 // Delegate to proper class loader 1076 ClassLoader loader = getClassLoader(); 1077 if (loader != null) { 1078 return loader.getResource(resName); 1079 } else { 1080 return ClassLoader.getSystemResource(resName); 1081 } 1082 } 1083 1084 /** 1085 * Returns a read-only stream for the contents of the resource specified by 1086 * {@code resName}. The mapping between the resource name and the stream is 1087 * managed by the class' class loader. 1088 * 1089 * @param resName 1090 * the name of the resource. 1091 * @return a stream for the requested resource or {@code null} if no 1092 * resource with the specified name can be found. 1093 * @see ClassLoader 1094 */ 1095 public InputStream getResourceAsStream(String resName) { 1096 // Get absolute resource name, but without the leading slash 1097 if (resName.startsWith("/")) { 1098 resName = resName.substring(1); 1099 } else { 1100 String pkg = getName(); 1101 int dot = pkg.lastIndexOf('.'); 1102 if (dot != -1) { 1103 pkg = pkg.substring(0, dot).replace('.', '/'); 1104 } else { 1105 pkg = ""; 1106 } 1107 1108 resName = pkg + "/" + resName; 1109 } 1110 1111 // Delegate to proper class loader 1112 ClassLoader loader = getClassLoader(); 1113 if (loader != null) { 1114 return loader.getResourceAsStream(resName); 1115 } else { 1116 return ClassLoader.getSystemResourceAsStream(resName); 1117 } 1118 } 1119 1120 /** 1121 * Returns null. (On Android, a {@code ClassLoader} can load classes from multiple dex files. 1122 * All classes from any given dex file will have the same signers, but different dex 1123 * files may have different signers. This does not fit well with the original 1124 * {@code ClassLoader}-based model of {@code getSigners}.) 1125 * 1126 * @return null. 1127 */ 1128 public Object[] getSigners() { 1129 // See http://code.google.com/p/android/issues/detail?id=1766. 1130 return null; 1131 } 1132 1133 /** 1134 * Returns the {@code Class} object which represents the superclass of the 1135 * class represented by this {@code Class}. If this {@code Class} represents 1136 * the {@code Object} class, a primitive type, an interface or void then the 1137 * method returns {@code null}. If this {@code Class} represents an array 1138 * class then the {@code Object} class is returned. 1139 * 1140 * @return the superclass of the class represented by this {@code Class}. 1141 */ 1142 public native Class<? super T> getSuperclass(); 1143 1144 /** 1145 * Returns an array containing {@code TypeVariable} objects for type 1146 * variables declared by the generic class represented by this {@code 1147 * Class}. Returns an empty array if the class is not generic. 1148 * 1149 * @return an array with the type variables of the class represented by this 1150 * class. 1151 */ 1152 @SuppressWarnings("unchecked") 1153 public synchronized TypeVariable<Class<T>>[] getTypeParameters() { 1154 GenericSignatureParser parser = new GenericSignatureParser(getClassLoader()); 1155 parser.parseForClass(this, getSignatureAttribute()); 1156 return parser.formalTypeParameters.clone(); 1157 } 1158 1159 /** 1160 * Indicates whether this {@code Class} represents an annotation class. 1161 * 1162 * @return {@code true} if this {@code Class} represents an annotation 1163 * class; {@code false} otherwise. 1164 */ 1165 public boolean isAnnotation() { 1166 final int ACC_ANNOTATION = 0x2000; // not public in reflect.Modifiers 1167 int mod = getModifiers(this, true); 1168 return (mod & ACC_ANNOTATION) != 0; 1169 } 1170 1171 @Override public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) { 1172 if (annotationType == null) { 1173 throw new NullPointerException("annotationType == null"); 1174 } 1175 1176 if (isDeclaredAnnotationPresent(annotationType)) { 1177 return true; 1178 } 1179 1180 if (annotationType.isDeclaredAnnotationPresent(Inherited.class)) { 1181 for (Class<?> sup = getSuperclass(); sup != null; sup = sup.getSuperclass()) { 1182 if (sup.isDeclaredAnnotationPresent(annotationType)) { 1183 return true; 1184 } 1185 } 1186 } 1187 1188 return false; 1189 } 1190 1191 /** 1192 * Indicates whether the class represented by this {@code Class} is 1193 * anonymously declared. 1194 * 1195 * @return {@code true} if the class represented by this {@code Class} is 1196 * anonymous; {@code false} otherwise. 1197 */ 1198 native public boolean isAnonymousClass(); 1199 1200 /** 1201 * Indicates whether the class represented by this {@code Class} is an array 1202 * class. 1203 * 1204 * @return {@code true} if the class represented by this {@code Class} is an 1205 * array class; {@code false} otherwise. 1206 */ 1207 public boolean isArray() { 1208 return getComponentType() != null; 1209 } 1210 1211 /** 1212 * Indicates whether the specified class type can be converted to the class 1213 * represented by this {@code Class}. Conversion may be done via an identity 1214 * conversion or a widening reference conversion (if either the receiver or 1215 * the argument represent primitive types, only the identity conversion 1216 * applies). 1217 * 1218 * @param cls 1219 * the class to check. 1220 * @return {@code true} if {@code cls} can be converted to the class 1221 * represented by this {@code Class}; {@code false} otherwise. 1222 * @throws NullPointerException 1223 * if {@code cls} is {@code null}. 1224 */ 1225 public native boolean isAssignableFrom(Class<?> cls); 1226 1227 /** 1228 * Indicates whether the class represented by this {@code Class} is an 1229 * {@code enum}. 1230 * 1231 * @return {@code true} if the class represented by this {@code Class} is an 1232 * {@code enum}; {@code false} otherwise. 1233 */ 1234 public boolean isEnum() { 1235 return ((getModifiers() & 0x4000) != 0) && (getSuperclass() == Enum.class); 1236 } 1237 1238 /** 1239 * Indicates whether the specified object can be cast to the class 1240 * represented by this {@code Class}. This is the runtime version of the 1241 * {@code instanceof} operator. 1242 * 1243 * @param object 1244 * the object to check. 1245 * @return {@code true} if {@code object} can be cast to the type 1246 * represented by this {@code Class}; {@code false} if {@code 1247 * object} is {@code null} or cannot be cast. 1248 */ 1249 public native boolean isInstance(Object object); 1250 1251 /** 1252 * Indicates whether this {@code Class} represents an interface. 1253 * 1254 * @return {@code true} if this {@code Class} represents an interface; 1255 * {@code false} otherwise. 1256 */ 1257 public native boolean isInterface(); 1258 1259 /** 1260 * Indicates whether the class represented by this {@code Class} is defined 1261 * locally. 1262 * 1263 * @return {@code true} if the class represented by this {@code Class} is 1264 * defined locally; {@code false} otherwise. 1265 */ 1266 public boolean isLocalClass() { 1267 boolean enclosed = (getEnclosingMethod() != null || 1268 getEnclosingConstructor() != null); 1269 return enclosed && !isAnonymousClass(); 1270 } 1271 1272 /** 1273 * Indicates whether the class represented by this {@code Class} is a member 1274 * class. 1275 * 1276 * @return {@code true} if the class represented by this {@code Class} is a 1277 * member class; {@code false} otherwise. 1278 */ 1279 public boolean isMemberClass() { 1280 return getDeclaringClass() != null; 1281 } 1282 1283 /** 1284 * Indicates whether this {@code Class} represents a primitive type. 1285 * 1286 * @return {@code true} if this {@code Class} represents a primitive type; 1287 * {@code false} otherwise. 1288 */ 1289 public native boolean isPrimitive(); 1290 1291 /** 1292 * Indicates whether this {@code Class} represents a synthetic type. 1293 * 1294 * @return {@code true} if this {@code Class} represents a synthetic type; 1295 * {@code false} otherwise. 1296 */ 1297 public boolean isSynthetic() { 1298 final int ACC_SYNTHETIC = 0x1000; // not public in reflect.Modifiers 1299 int mod = getModifiers(this, true); 1300 return (mod & ACC_SYNTHETIC) != 0; 1301 } 1302 1303 /** 1304 * Returns a new instance of the class represented by this {@code Class}, 1305 * created by invoking the default (that is, zero-argument) constructor. If 1306 * there is no such constructor, or if the creation fails (either because of 1307 * a lack of available memory or because an exception is thrown by the 1308 * constructor), an {@code InstantiationException} is thrown. If the default 1309 * constructor exists but is not accessible from the context where this 1310 * method is invoked, an {@code IllegalAccessException} is thrown. 1311 * 1312 * @return a new instance of the class represented by this {@code Class}. 1313 * @throws IllegalAccessException 1314 * if the default constructor is not visible. 1315 * @throws InstantiationException 1316 * if the instance can not be created. 1317 */ 1318 public T newInstance() throws InstantiationException, IllegalAccessException { 1319 return newInstanceImpl(); 1320 } 1321 1322 private native T newInstanceImpl() throws IllegalAccessException, InstantiationException; 1323 1324 @Override 1325 public String toString() { 1326 if (isPrimitive()) { 1327 return getSimpleName(); 1328 } else { 1329 return (isInterface() ? "interface " : "class ") + getName(); 1330 } 1331 } 1332 1333 /** 1334 * Returns the {@code Package} of which the class represented by this 1335 * {@code Class} is a member. Returns {@code null} if no {@code Package} 1336 * object was created by the class loader of the class. 1337 * 1338 * @return Package the {@code Package} of which this {@code Class} is a 1339 * member or {@code null}. 1340 */ 1341 public Package getPackage() { 1342 // TODO This might be a hack, but the VM doesn't have the necessary info. 1343 ClassLoader loader = getClassLoader(); 1344 if (loader != null) { 1345 String name = getName(); 1346 int dot = name.lastIndexOf('.'); 1347 return (dot != -1 ? loader.getPackage(name.substring(0, dot)) : null); 1348 } 1349 return null; 1350 } 1351 1352 /** 1353 * Returns the assertion status for the class represented by this {@code 1354 * Class}. Assertion is enabled / disabled based on the class loader, 1355 * package or class default at runtime. 1356 * 1357 * @return the assertion status for the class represented by this {@code 1358 * Class}. 1359 */ 1360 public native boolean desiredAssertionStatus(); 1361 1362 /** 1363 * Casts this {@code Class} to represent a subclass of the specified class. 1364 * If successful, this {@code Class} is returned; otherwise a {@code 1365 * ClassCastException} is thrown. 1366 * 1367 * @param clazz 1368 * the required type. 1369 * @return this {@code Class} cast as a subclass of the given type. 1370 * @throws ClassCastException 1371 * if this {@code Class} cannot be cast to the specified type. 1372 */ 1373 @SuppressWarnings("unchecked") 1374 public <U> Class<? extends U> asSubclass(Class<U> clazz) { 1375 if (clazz.isAssignableFrom(this)) { 1376 return (Class<? extends U>)this; 1377 } 1378 String actualClassName = this.getName(); 1379 String desiredClassName = clazz.getName(); 1380 throw new ClassCastException(actualClassName + " cannot be cast to " + desiredClassName); 1381 } 1382 1383 /** 1384 * Casts the specified object to the type represented by this {@code Class}. 1385 * If the object is {@code null} then the result is also {@code null}. 1386 * 1387 * @param obj 1388 * the object to cast. 1389 * @return the object that has been cast. 1390 * @throws ClassCastException 1391 * if the object cannot be cast to the specified type. 1392 */ 1393 @SuppressWarnings("unchecked") 1394 public T cast(Object obj) { 1395 if (obj == null) { 1396 return null; 1397 } else if (this.isInstance(obj)) { 1398 return (T)obj; 1399 } 1400 String actualClassName = obj.getClass().getName(); 1401 String desiredClassName = this.getName(); 1402 throw new ClassCastException(actualClassName + " cannot be cast to " + desiredClassName); 1403 } 1404 1405 /** 1406 * Copies two arrays into one. Assumes that the destination array is large 1407 * enough. 1408 * 1409 * @param result the destination array 1410 * @param head the first source array 1411 * @param tail the second source array 1412 * @return the destination array, that is, result 1413 */ 1414 private static <T extends Object> T[] arraycopy(T[] result, T[] head, T[] tail) { 1415 System.arraycopy(head, 0, result, 0, head.length); 1416 System.arraycopy(tail, 0, result, head.length, tail.length); 1417 return result; 1418 } 1419 } 1420