1 /*
2 * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.lang.reflect;
27
28 import jdk.internal.misc.SharedSecrets;
29 import jdk.internal.reflect.CallerSensitive;
30 import jdk.internal.reflect.ConstructorAccessor;
31 import jdk.internal.reflect.Reflection;
32 import jdk.internal.vm.annotation.ForceInline;
33 import sun.reflect.annotation.TypeAnnotation;
34 import sun.reflect.annotation.TypeAnnotationParser;
35 import sun.reflect.generics.repository.ConstructorRepository;
36 import sun.reflect.generics.factory.CoreReflectionFactory;
37 import sun.reflect.generics.factory.GenericsFactory;
38 import sun.reflect.generics.scope.ConstructorScope;
39 import java.lang.annotation.Annotation;
40 import java.lang.annotation.AnnotationFormatError;
41 import java.util.StringJoiner;
42
43 /**
44 * {@code Constructor} provides information about, and access to, a single
45 * constructor for a class.
46 *
47 * <p>{@code Constructor} permits widening conversions to occur when matching the
48 * actual parameters to newInstance() with the underlying
49 * constructor's formal parameters, but throws an
50 * {@code IllegalArgumentException} if a narrowing conversion would occur.
51 *
52 * @param <T> the class in which the constructor is declared
53 *
54 * @see Member
55 * @see java.lang.Class
56 * @see java.lang.Class#getConstructors()
57 * @see java.lang.Class#getConstructor(Class[])
58 * @see java.lang.Class#getDeclaredConstructors()
59 *
60 * @author Kenneth Russell
61 * @author Nakul Saraiya
62 * @since 1.1
63 */
64 public final class Constructor<T> extends Executable {
65 private Class<T> clazz;
66 private int slot;
67 private Class<?>[] parameterTypes;
68 private Class<?>[] exceptionTypes;
69 private int modifiers;
70 // Generics and annotations support
71 private transient String signature;
72 // generic info repository; lazily initialized
73 private transient ConstructorRepository genericInfo;
74 private byte[] annotations;
75 private byte[] parameterAnnotations;
76
77 // Generics infrastructure
78 // Accessor for factory
79 private GenericsFactory getFactory() {
80 // create scope and factory
81 return CoreReflectionFactory.make(this, ConstructorScope.make(this));
82 }
83
84 // Accessor for generic info repository
85 @Override
86 ConstructorRepository getGenericInfo() {
87 // lazily initialize repository if necessary
88 if (genericInfo == null) {
89 // create and cache generic info repository
90 genericInfo =
91 ConstructorRepository.make(getSignature(),
92 getFactory());
93 }
94 return genericInfo; //return cached repository
95 }
96
97 private volatile ConstructorAccessor constructorAccessor;
98 // For sharing of ConstructorAccessors. This branching structure
99 // is currently only two levels deep (i.e., one root Constructor
100 // and potentially many Constructor objects pointing to it.)
101 //
102 // If this branching structure would ever contain cycles, deadlocks can
103 // occur in annotation code.
104 private Constructor<T> root;
105
106 @Override
107 Constructor<T> getRoot() {
108 return root;
109 }
110
111 /**
112 * Package-private constructor used by ReflectAccess to enable
113 * instantiation of these objects in Java code from the java.lang
114 * package via sun.reflect.LangReflectAccess.
115 */
116 Constructor(Class<T> declaringClass,
117 Class<?>[] parameterTypes,
118 Class<?>[] checkedExceptions,
119 int modifiers,
120 int slot,
121 String signature,
122 byte[] annotations,
123 byte[] parameterAnnotations) {
124 this.clazz = declaringClass;
125 this.parameterTypes = parameterTypes;
126 this.exceptionTypes = checkedExceptions;
127 this.modifiers = modifiers;
128 this.slot = slot;
129 this.signature = signature;
130 this.annotations = annotations;
131 this.parameterAnnotations = parameterAnnotations;
132 }
133
134 /**
135 * Package-private routine (exposed to java.lang.Class via
136 * ReflectAccess) which returns a copy of this Constructor. The copy's
137 * "root" field points to this Constructor.
138 */
139 Constructor<T> copy() {
140 // This routine enables sharing of ConstructorAccessor objects
141 // among Constructor objects which refer to the same underlying
142 // method in the VM. (All of this contortion is only necessary
143 // because of the "accessibility" bit in AccessibleObject,
144 // which implicitly requires that new java.lang.reflect
145 // objects be fabricated for each reflective call on Class
146 // objects.)
147 if (this.root != null)
148 throw new IllegalArgumentException("Can not copy a non-root Constructor");
149
150 Constructor<T> res = new Constructor<>(clazz,
151 parameterTypes,
152 exceptionTypes, modifiers, slot,
153 signature,
154 annotations,
155 parameterAnnotations);
156 res.root = this;
157 // Might as well eagerly propagate this if already present
158 res.constructorAccessor = constructorAccessor;
159 return res;
160 }
161
162 /**
163 * {@inheritDoc}
164 *
165 * <p> A {@code SecurityException} is also thrown if this object is a
166 * {@code Constructor} object for the class {@code Class} and {@code flag}
167 * is true. </p>
168 *
169 * @param flag {@inheritDoc}
170 *
171 * @throws InaccessibleObjectException {@inheritDoc}
172 * @throws SecurityException if the request is denied by the security manager
173 * or this is a constructor for {@code java.lang.Class}
174 *
175 * @spec JPMS
176 */
177 @Override
178 @CallerSensitive
179 public void setAccessible(boolean flag) {
180 AccessibleObject.checkPermission();
181 if (flag) {
182 checkCanSetAccessible(Reflection.getCallerClass());
183 }
184 setAccessible0(flag);
185 }
186
187 @Override
188 void checkCanSetAccessible(Class<?> caller) {
189 checkCanSetAccessible(caller, clazz);
190 if (clazz == Class.class) {
191 // can we change this to InaccessibleObjectException?
192 throw new SecurityException("Cannot make a java.lang.Class"
193 + " constructor accessible");
194 }
195 }
196
197 @Override
198 boolean hasGenericInformation() {
199 return (getSignature() != null);
200 }
201
202 @Override
203 byte[] getAnnotationBytes() {
204 return annotations;
205 }
206
207 /**
208 * Returns the {@code Class} object representing the class that
209 * declares the constructor represented by this object.
210 */
211 @Override
212 public Class<T> getDeclaringClass() {
213 return clazz;
214 }
215
216 /**
217 * Returns the name of this constructor, as a string. This is
218 * the binary name of the constructor's declaring class.
219 */
220 @Override
221 public String getName() {
222 return getDeclaringClass().getName();
223 }
224
225 /**
226 * {@inheritDoc}
227 */
228 @Override
229 public int getModifiers() {
230 return modifiers;
231 }
232
233 /**
234 * {@inheritDoc}
235 * @throws GenericSignatureFormatError {@inheritDoc}
236 * @since 1.5
237 */
238 @Override
239 @SuppressWarnings({"rawtypes", "unchecked"})
240 public TypeVariable<Constructor<T>>[] getTypeParameters() {
241 if (getSignature() != null) {
242 return (TypeVariable<Constructor<T>>[])getGenericInfo().getTypeParameters();
243 } else
244 return (TypeVariable<Constructor<T>>[])new TypeVariable[0];
245 }
246
247
248 @Override
249 Class<?>[] getSharedParameterTypes() {
250 return parameterTypes;
251 }
252
253 @Override
254 Class<?>[] getSharedExceptionTypes() {
255 return exceptionTypes;
256 }
257
258 /**
259 * {@inheritDoc}
260 */
261 @Override
262 public Class<?>[] getParameterTypes() {
263 return parameterTypes.clone();
264 }
265
266 /**
267 * {@inheritDoc}
268 * @since 1.8
269 */
270 public int getParameterCount() { return parameterTypes.length; }
271
272 /**
273 * {@inheritDoc}
274 * @throws GenericSignatureFormatError {@inheritDoc}
275 * @throws TypeNotPresentException {@inheritDoc}
276 * @throws MalformedParameterizedTypeException {@inheritDoc}
277 * @since 1.5
278 */
279 @Override
280 public Type[] getGenericParameterTypes() {
281 return super.getGenericParameterTypes();
282 }
283
284 /**
285 * {@inheritDoc}
286 */
287 @Override
288 public Class<?>[] getExceptionTypes() {
289 return exceptionTypes.clone();
290 }
291
292
293 /**
294 * {@inheritDoc}
295 * @throws GenericSignatureFormatError {@inheritDoc}
296 * @throws TypeNotPresentException {@inheritDoc}
297 * @throws MalformedParameterizedTypeException {@inheritDoc}
298 * @since 1.5
299 */
300 @Override
301 public Type[] getGenericExceptionTypes() {
302 return super.getGenericExceptionTypes();
303 }
304
305 /**
306 * Compares this {@code Constructor} against the specified object.
307 * Returns true if the objects are the same. Two {@code Constructor} objects are
308 * the same if they were declared by the same class and have the
309 * same formal parameter types.
310 */
311 public boolean equals(Object obj) {
312 if (obj != null && obj instanceof Constructor) {
313 Constructor<?> other = (Constructor<?>)obj;
314 if (getDeclaringClass() == other.getDeclaringClass()) {
315 return equalParamTypes(parameterTypes, other.parameterTypes);
316 }
317 }
318 return false;
319 }
320
321 /**
322 * Returns a hashcode for this {@code Constructor}. The hashcode is
323 * the same as the hashcode for the underlying constructor's
324 * declaring class name.
325 */
326 public int hashCode() {
327 return getDeclaringClass().getName().hashCode();
328 }
329
330 /**
331 * Returns a string describing this {@code Constructor}. The string is
332 * formatted as the constructor access modifiers, if any,
333 * followed by the fully-qualified name of the declaring class,
334 * followed by a parenthesized, comma-separated list of the
335 * constructor's formal parameter types. For example:
336 * <pre>{@code
337 * public java.util.Hashtable(int,float)
338 * }</pre>
339 *
340 * <p>If the constructor is declared to throw exceptions, the
341 * parameter list is followed by a space, followed by the word
342 * "{@code throws}" followed by a comma-separated list of the
343 * thrown exception types.
344 *
345 * <p>The only possible modifiers for constructors are the access
346 * modifiers {@code public}, {@code protected} or
347 * {@code private}. Only one of these may appear, or none if the
348 * constructor has default (package) access.
349 *
350 * @return a string describing this {@code Constructor}
351 * @jls 8.8.3 Constructor Modifiers
352 * @jls 8.9.2 Enum Body Declarations
353 */
354 public String toString() {
355 return sharedToString(Modifier.constructorModifiers(),
356 false,
357 parameterTypes,
358 exceptionTypes);
359 }
360
361 @Override
362 void specificToStringHeader(StringBuilder sb) {
363 sb.append(getDeclaringClass().getTypeName());
364 }
365
366 @Override
367 String toShortString() {
368 StringBuilder sb = new StringBuilder("constructor ");
369 sb.append(getDeclaringClass().getTypeName());
370 sb.append('(');
371 StringJoiner sj = new StringJoiner(",");
372 for (Class<?> parameterType : getParameterTypes()) {
373 sj.add(parameterType.getTypeName());
374 }
375 sb.append(sj);
376 sb.append(')');
377 return sb.toString();
378 }
379
380 /**
381 * Returns a string describing this {@code Constructor},
382 * including type parameters. The string is formatted as the
383 * constructor access modifiers, if any, followed by an
384 * angle-bracketed comma separated list of the constructor's type
385 * parameters, if any, followed by the fully-qualified name of the
386 * declaring class, followed by a parenthesized, comma-separated
387 * list of the constructor's generic formal parameter types.
388 *
389 * If this constructor was declared to take a variable number of
390 * arguments, instead of denoting the last parameter as
391 * "<code><i>Type</i>[]</code>", it is denoted as
392 * "<code><i>Type</i>...</code>".
393 *
394 * A space is used to separate access modifiers from one another
395 * and from the type parameters or class name. If there are no
396 * type parameters, the type parameter list is elided; if the type
397 * parameter list is present, a space separates the list from the
398 * class name. If the constructor is declared to throw
399 * exceptions, the parameter list is followed by a space, followed
400 * by the word "{@code throws}" followed by a
401 * comma-separated list of the generic thrown exception types.
402 *
403 * <p>The only possible modifiers for constructors are the access
404 * modifiers {@code public}, {@code protected} or
405 * {@code private}. Only one of these may appear, or none if the
406 * constructor has default (package) access.
407 *
408 * @return a string describing this {@code Constructor},
409 * include type parameters
410 *
411 * @since 1.5
412 * @jls 8.8.3 Constructor Modifiers
413 * @jls 8.9.2 Enum Body Declarations
414 */
415 @Override
416 public String toGenericString() {
417 return sharedToGenericString(Modifier.constructorModifiers(), false);
418 }
419
420 @Override
421 void specificToGenericStringHeader(StringBuilder sb) {
422 specificToStringHeader(sb);
423 }
424
425 /**
426 * Uses the constructor represented by this {@code Constructor} object to
427 * create and initialize a new instance of the constructor's
428 * declaring class, with the specified initialization parameters.
429 * Individual parameters are automatically unwrapped to match
430 * primitive formal parameters, and both primitive and reference
431 * parameters are subject to method invocation conversions as necessary.
432 *
433 * <p>If the number of formal parameters required by the underlying constructor
434 * is 0, the supplied {@code initargs} array may be of length 0 or null.
435 *
436 * <p>If the constructor's declaring class is an inner class in a
437 * non-static context, the first argument to the constructor needs
438 * to be the enclosing instance; see section 15.9.3 of
439 * <cite>The Java™ Language Specification</cite>.
440 *
441 * <p>If the required access and argument checks succeed and the
442 * instantiation will proceed, the constructor's declaring class
443 * is initialized if it has not already been initialized.
444 *
445 * <p>If the constructor completes normally, returns the newly
446 * created and initialized instance.
447 *
448 * @param initargs array of objects to be passed as arguments to
449 * the constructor call; values of primitive types are wrapped in
450 * a wrapper object of the appropriate type (e.g. a {@code float}
451 * in a {@link java.lang.Float Float})
452 *
453 * @return a new object created by calling the constructor
454 * this object represents
455 *
456 * @exception IllegalAccessException if this {@code Constructor} object
457 * is enforcing Java language access control and the underlying
458 * constructor is inaccessible.
459 * @exception IllegalArgumentException if the number of actual
460 * and formal parameters differ; if an unwrapping
461 * conversion for primitive arguments fails; or if,
462 * after possible unwrapping, a parameter value
463 * cannot be converted to the corresponding formal
464 * parameter type by a method invocation conversion; if
465 * this constructor pertains to an enum type.
466 * @exception InstantiationException if the class that declares the
467 * underlying constructor represents an abstract class.
468 * @exception InvocationTargetException if the underlying constructor
469 * throws an exception.
470 * @exception ExceptionInInitializerError if the initialization provoked
471 * by this method fails.
472 */
473 @CallerSensitive
474 @ForceInline // to ensure Reflection.getCallerClass optimization
475 public T newInstance(Object ... initargs)
476 throws InstantiationException, IllegalAccessException,
477 IllegalArgumentException, InvocationTargetException
478 {
479 if (!override) {
480 Class<?> caller = Reflection.getCallerClass();
481 checkAccess(caller, clazz, clazz, modifiers);
482 }
483 if ((clazz.getModifiers() & Modifier.ENUM) != 0)
484 throw new IllegalArgumentException("Cannot reflectively create enum objects");
485 ConstructorAccessor ca = constructorAccessor; // read volatile
486 if (ca == null) {
487 ca = acquireConstructorAccessor();
488 }
489 @SuppressWarnings("unchecked")
490 T inst = (T) ca.newInstance(initargs);
491 return inst;
492 }
493
494 /**
495 * {@inheritDoc}
496 * @since 1.5
497 */
498 @Override
499 public boolean isVarArgs() {
500 return super.isVarArgs();
501 }
502
503 /**
504 * {@inheritDoc}
505 * @jls 13.1 The Form of a Binary
506 * @since 1.5
507 */
508 @Override
509 public boolean isSynthetic() {
510 return super.isSynthetic();
511 }
512
513 // NOTE that there is no synchronization used here. It is correct
514 // (though not efficient) to generate more than one
515 // ConstructorAccessor for a given Constructor. However, avoiding
516 // synchronization will probably make the implementation more
517 // scalable.
518 private ConstructorAccessor acquireConstructorAccessor() {
519 // First check to see if one has been created yet, and take it
520 // if so.
521 ConstructorAccessor tmp = null;
522 if (root != null) tmp = root.getConstructorAccessor();
523 if (tmp != null) {
524 constructorAccessor = tmp;
525 } else {
526 // Otherwise fabricate one and propagate it up to the root
527 tmp = reflectionFactory.newConstructorAccessor(this);
528 setConstructorAccessor(tmp);
529 }
530
531 return tmp;
532 }
533
534 // Returns ConstructorAccessor for this Constructor object, not
535 // looking up the chain to the root
536 ConstructorAccessor getConstructorAccessor() {
537 return constructorAccessor;
538 }
539
540 // Sets the ConstructorAccessor for this Constructor object and
541 // (recursively) its root
542 void setConstructorAccessor(ConstructorAccessor accessor) {
543 constructorAccessor = accessor;
544 // Propagate up
545 if (root != null) {
546 root.setConstructorAccessor(accessor);
547 }
548 }
549
550 int getSlot() {
551 return slot;
552 }
553
554 String getSignature() {
555 return signature;
556 }
557
558 byte[] getRawAnnotations() {
559 return annotations;
560 }
561
562 byte[] getRawParameterAnnotations() {
563 return parameterAnnotations;
564 }
565
566
567 /**
568 * {@inheritDoc}
569 * @throws NullPointerException {@inheritDoc}
570 * @since 1.5
571 */
572 public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
573 return super.getAnnotation(annotationClass);
574 }
575
576 /**
577 * {@inheritDoc}
578 * @since 1.5
579 */
580 public Annotation[] getDeclaredAnnotations() {
581 return super.getDeclaredAnnotations();
582 }
583
584 /**
585 * {@inheritDoc}
586 * @since 1.5
587 */
588 @Override
589 public Annotation[][] getParameterAnnotations() {
590 return sharedGetParameterAnnotations(parameterTypes, parameterAnnotations);
591 }
592
593 @Override
594 boolean handleParameterNumberMismatch(int resultLength, int numParameters) {
595 Class<?> declaringClass = getDeclaringClass();
596 if (declaringClass.isEnum() ||
597 declaringClass.isAnonymousClass() ||
598 declaringClass.isLocalClass() )
599 return false; // Can't do reliable parameter counting
600 else {
601 if (declaringClass.isMemberClass() &&
602 ((declaringClass.getModifiers() & Modifier.STATIC) == 0) &&
603 resultLength + 1 == numParameters) {
604 return true;
605 } else {
606 throw new AnnotationFormatError(
607 "Parameter annotations don't match number of parameters");
608 }
609 }
610 }
611
612 /**
613 * {@inheritDoc}
614 * @since 1.8
615 */
616 @Override
617 public AnnotatedType getAnnotatedReturnType() {
618 return getAnnotatedReturnType0(getDeclaringClass());
619 }
620
621 /**
622 * {@inheritDoc}
623 * @since 1.8
624 */
625 @Override
626 public AnnotatedType getAnnotatedReceiverType() {
627 Class<?> thisDeclClass = getDeclaringClass();
628 Class<?> enclosingClass = thisDeclClass.getEnclosingClass();
629
630 if (enclosingClass == null) {
631 // A Constructor for a top-level class
632 return null;
633 }
634
635 Class<?> outerDeclaringClass = thisDeclClass.getDeclaringClass();
636 if (outerDeclaringClass == null) {
637 // A constructor for a local or anonymous class
638 return null;
639 }
640
641 // Either static nested or inner class
642 if (Modifier.isStatic(thisDeclClass.getModifiers())) {
643 // static nested
644 return null;
645 }
646
647 // A Constructor for an inner class
648 return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes0(),
649 SharedSecrets.getJavaLangAccess().
650 getConstantPool(thisDeclClass),
651 this,
652 thisDeclClass,
653 enclosingClass,
654 TypeAnnotation.TypeAnnotationTarget.METHOD_RECEIVER);
655 }
656 }
657