History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/lang/reflect/Constructor.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/lang/reflect/Constructor.java+683−0
@@ -0,0 +1,683 @@
1+/*
2+ * Copyright (c) 1996, 2010, 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 sun.reflect.ConstructorAccessor;
29+import sun.reflect.Reflection;
30+import sun.reflect.generics.repository.ConstructorRepository;
31+import sun.reflect.generics.factory.CoreReflectionFactory;
32+import sun.reflect.generics.factory.GenericsFactory;
33+import sun.reflect.generics.scope.ConstructorScope;
34+import java.lang.annotation.Annotation;
35+import java.util.Map;
36+import sun.reflect.annotation.AnnotationParser;
37+import java.lang.annotation.AnnotationFormatError;
38+import java.lang.reflect.Modifier;
39+
40+/**
41+ * {@code Constructor} provides information about, and access to, a single
42+ * constructor for a class.
43+ *
44+ * <p>{@code Constructor} permits widening conversions to occur when matching the
45+ * actual parameters to newInstance() with the underlying
46+ * constructor's formal parameters, but throws an
47+ * {@code IllegalArgumentException} if a narrowing conversion would occur.
48+ *
49+ * @param <T> the class in which the constructor is declared
50+ *
51+ * @see Member
52+ * @see java.lang.Class
53+ * @see java.lang.Class#getConstructors()
54+ * @see java.lang.Class#getConstructor(Class[])
55+ * @see java.lang.Class#getDeclaredConstructors()
56+ *
57+ * @author Kenneth Russell
58+ * @author Nakul Saraiya
59+ */
60+public final
61+ class Constructor<T> extends AccessibleObject implements
62+ GenericDeclaration,
63+ Member {
64+
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+ private ConstructorRepository getGenericInfo() {
86+ // lazily initialize repository if necessary
87+ if (genericInfo == null) {
88+ // create and cache generic info repository
89+ genericInfo =
90+ ConstructorRepository.make(getSignature(),
91+ getFactory());
92+ }
93+ return genericInfo; //return cached repository
94+ }
95+
96+ private volatile ConstructorAccessor constructorAccessor;
97+ // For sharing of ConstructorAccessors. This branching structure
98+ // is currently only two levels deep (i.e., one root Constructor
99+ // and potentially many Constructor objects pointing to it.)
100+ private Constructor<T> root;
101+
102+ /**
103+ * Package-private constructor used by ReflectAccess to enable
104+ * instantiation of these objects in Java code from the java.lang
105+ * package via sun.reflect.LangReflectAccess.
106+ */
107+ Constructor(Class<T> declaringClass,
108+ Class<?>[] parameterTypes,
109+ Class<?>[] checkedExceptions,
110+ int modifiers,
111+ int slot,
112+ String signature,
113+ byte[] annotations,
114+ byte[] parameterAnnotations)
115+ {
116+ this.clazz = declaringClass;
117+ this.parameterTypes = parameterTypes;
118+ this.exceptionTypes = checkedExceptions;
119+ this.modifiers = modifiers;
120+ this.slot = slot;
121+ this.signature = signature;
122+ this.annotations = annotations;
123+ this.parameterAnnotations = parameterAnnotations;
124+ }
125+
126+ /**
127+ * Package-private routine (exposed to java.lang.Class via
128+ * ReflectAccess) which returns a copy of this Constructor. The copy's
129+ * "root" field points to this Constructor.
130+ */
131+ Constructor<T> copy() {
132+ // This routine enables sharing of ConstructorAccessor objects
133+ // among Constructor objects which refer to the same underlying
134+ // method in the VM. (All of this contortion is only necessary
135+ // because of the "accessibility" bit in AccessibleObject,
136+ // which implicitly requires that new java.lang.reflect
137+ // objects be fabricated for each reflective call on Class
138+ // objects.)
139+ Constructor<T> res = new Constructor<>(clazz,
140+ parameterTypes,
141+ exceptionTypes, modifiers, slot,
142+ signature,
143+ annotations,
144+ parameterAnnotations);
145+ res.root = this;
146+ // Might as well eagerly propagate this if already present
147+ res.constructorAccessor = constructorAccessor;
148+ return res;
149+ }
150+
151+ /**
152+ * Returns the {@code Class} object representing the class that declares
153+ * the constructor represented by this {@code Constructor} object.
154+ */
155+ public Class<T> getDeclaringClass() {
156+ return clazz;
157+ }
158+
159+ /**
160+ * Returns the name of this constructor, as a string. This is
161+ * the binary name of the constructor's declaring class.
162+ */
163+ public String getName() {
164+ return getDeclaringClass().getName();
165+ }
166+
167+ /**
168+ * Returns the Java language modifiers for the constructor
169+ * represented by this {@code Constructor} object, as an integer. The
170+ * {@code Modifier} class should be used to decode the modifiers.
171+ *
172+ * @see Modifier
173+ */
174+ public int getModifiers() {
175+ return modifiers;
176+ }
177+
178+ /**
179+ * Returns an array of {@code TypeVariable} objects that represent the
180+ * type variables declared by the generic declaration represented by this
181+ * {@code GenericDeclaration} object, in declaration order. Returns an
182+ * array of length 0 if the underlying generic declaration declares no type
183+ * variables.
184+ *
185+ * @return an array of {@code TypeVariable} objects that represent
186+ * the type variables declared by this generic declaration
187+ * @throws GenericSignatureFormatError if the generic
188+ * signature of this generic declaration does not conform to
189+ * the format specified in
190+ * <cite>The Java&trade; Virtual Machine Specification</cite>
191+ * @since 1.5
192+ */
193+ public TypeVariable<Constructor<T>>[] getTypeParameters() {
194+ if (getSignature() != null) {
195+ return (TypeVariable<Constructor<T>>[])getGenericInfo().getTypeParameters();
196+ } else
197+ return (TypeVariable<Constructor<T>>[])new TypeVariable[0];
198+ }
199+
200+
201+ /**
202+ * Returns an array of {@code Class} objects that represent the formal
203+ * parameter types, in declaration order, of the constructor
204+ * represented by this {@code Constructor} object. Returns an array of
205+ * length 0 if the underlying constructor takes no parameters.
206+ *
207+ * @return the parameter types for the constructor this object
208+ * represents
209+ */
210+ public Class<?>[] getParameterTypes() {
211+ return (Class<?>[]) parameterTypes.clone();
212+ }
213+
214+
215+ /**
216+ * Returns an array of {@code Type} objects that represent the formal
217+ * parameter types, in declaration order, of the method represented by
218+ * this {@code Constructor} object. Returns an array of length 0 if the
219+ * underlying method takes no parameters.
220+ *
221+ * <p>If a formal parameter type is a parameterized type,
222+ * the {@code Type} object returned for it must accurately reflect
223+ * the actual type parameters used in the source code.
224+ *
225+ * <p>If a formal parameter type is a type variable or a parameterized
226+ * type, it is created. Otherwise, it is resolved.
227+ *
228+ * @return an array of {@code Type}s that represent the formal
229+ * parameter types of the underlying method, in declaration order
230+ * @throws GenericSignatureFormatError
231+ * if the generic method signature does not conform to the format
232+ * specified in
233+ * <cite>The Java&trade; Virtual Machine Specification</cite>
234+ * @throws TypeNotPresentException if any of the parameter
235+ * types of the underlying method refers to a non-existent type
236+ * declaration
237+ * @throws MalformedParameterizedTypeException if any of
238+ * the underlying method's parameter types refer to a parameterized
239+ * type that cannot be instantiated for any reason
240+ * @since 1.5
241+ */
242+ public Type[] getGenericParameterTypes() {
243+ if (getSignature() != null)
244+ return getGenericInfo().getParameterTypes();
245+ else
246+ return getParameterTypes();
247+ }
248+
249+
250+ /**
251+ * Returns an array of {@code Class} objects that represent the types
252+ * of exceptions declared to be thrown by the underlying constructor
253+ * represented by this {@code Constructor} object. Returns an array of
254+ * length 0 if the constructor declares no exceptions in its {@code throws} clause.
255+ *
256+ * @return the exception types declared as being thrown by the
257+ * constructor this object represents
258+ */
259+ public Class<?>[] getExceptionTypes() {
260+ return (Class<?>[])exceptionTypes.clone();
261+ }
262+
263+
264+ /**
265+ * Returns an array of {@code Type} objects that represent the
266+ * exceptions declared to be thrown by this {@code Constructor} object.
267+ * Returns an array of length 0 if the underlying method declares
268+ * no exceptions in its {@code throws} clause.
269+ *
270+ * <p>If an exception type is a type variable or a parameterized
271+ * type, it is created. Otherwise, it is resolved.
272+ *
273+ * @return an array of Types that represent the exception types
274+ * thrown by the underlying method
275+ * @throws GenericSignatureFormatError
276+ * if the generic method signature does not conform to the format
277+ * specified in
278+ * <cite>The Java&trade; Virtual Machine Specification</cite>
279+ * @throws TypeNotPresentException if the underlying method's
280+ * {@code throws} clause refers to a non-existent type declaration
281+ * @throws MalformedParameterizedTypeException if
282+ * the underlying method's {@code throws} clause refers to a
283+ * parameterized type that cannot be instantiated for any reason
284+ * @since 1.5
285+ */
286+ public Type[] getGenericExceptionTypes() {
287+ Type[] result;
288+ if (getSignature() != null &&
289+ ( (result = getGenericInfo().getExceptionTypes()).length > 0 ))
290+ return result;
291+ else
292+ return getExceptionTypes();
293+ }
294+
295+ /**
296+ * Compares this {@code Constructor} against the specified object.
297+ * Returns true if the objects are the same. Two {@code Constructor} objects are
298+ * the same if they were declared by the same class and have the
299+ * same formal parameter types.
300+ */
301+ public boolean equals(Object obj) {
302+ if (obj != null && obj instanceof Constructor) {
303+ Constructor<?> other = (Constructor<?>)obj;
304+ if (getDeclaringClass() == other.getDeclaringClass()) {
305+ /* Avoid unnecessary cloning */
306+ Class<?>[] params1 = parameterTypes;
307+ Class<?>[] params2 = other.parameterTypes;
308+ if (params1.length == params2.length) {
309+ for (int i = 0; i < params1.length; i++) {
310+ if (params1[i] != params2[i])
311+ return false;
312+ }
313+ return true;
314+ }
315+ }
316+ }
317+ return false;
318+ }
319+
320+ /**
321+ * Returns a hashcode for this {@code Constructor}. The hashcode is
322+ * the same as the hashcode for the underlying constructor's
323+ * declaring class name.
324+ */
325+ public int hashCode() {
326+ return getDeclaringClass().getName().hashCode();
327+ }
328+
329+ /**
330+ * Returns a string describing this {@code Constructor}. The string is
331+ * formatted as the constructor access modifiers, if any,
332+ * followed by the fully-qualified name of the declaring class,
333+ * followed by a parenthesized, comma-separated list of the
334+ * constructor's formal parameter types. For example:
335+ * <pre>
336+ * public java.util.Hashtable(int,float)
337+ * </pre>
338+ *
339+ * <p>The only possible modifiers for constructors are the access
340+ * modifiers {@code public}, {@code protected} or
341+ * {@code private}. Only one of these may appear, or none if the
342+ * constructor has default (package) access.
343+ */
344+ public String toString() {
345+ try {
346+ StringBuffer sb = new StringBuffer();
347+ int mod = getModifiers() & Modifier.constructorModifiers();
348+ if (mod != 0) {
349+ sb.append(Modifier.toString(mod) + " ");
350+ }
351+ sb.append(Field.getTypeName(getDeclaringClass()));
352+ sb.append("(");
353+ Class<?>[] params = parameterTypes; // avoid clone
354+ for (int j = 0; j < params.length; j++) {
355+ sb.append(Field.getTypeName(params[j]));
356+ if (j < (params.length - 1))
357+ sb.append(",");
358+ }
359+ sb.append(")");
360+ Class<?>[] exceptions = exceptionTypes; // avoid clone
361+ if (exceptions.length > 0) {
362+ sb.append(" throws ");
363+ for (int k = 0; k < exceptions.length; k++) {
364+ sb.append(exceptions[k].getName());
365+ if (k < (exceptions.length - 1))
366+ sb.append(",");
367+ }
368+ }
369+ return sb.toString();
370+ } catch (Exception e) {
371+ return "<" + e + ">";
372+ }
373+ }
374+
375+ /**
376+ * Returns a string describing this {@code Constructor},
377+ * including type parameters. The string is formatted as the
378+ * constructor access modifiers, if any, followed by an
379+ * angle-bracketed comma separated list of the constructor's type
380+ * parameters, if any, followed by the fully-qualified name of the
381+ * declaring class, followed by a parenthesized, comma-separated
382+ * list of the constructor's generic formal parameter types.
383+ *
384+ * If this constructor was declared to take a variable number of
385+ * arguments, instead of denoting the last parameter as
386+ * "<tt><i>Type</i>[]</tt>", it is denoted as
387+ * "<tt><i>Type</i>...</tt>".
388+ *
389+ * A space is used to separate access modifiers from one another
390+ * and from the type parameters or return type. If there are no
391+ * type parameters, the type parameter list is elided; if the type
392+ * parameter list is present, a space separates the list from the
393+ * class name. If the constructor is declared to throw
394+ * exceptions, the parameter list is followed by a space, followed
395+ * by the word "{@code throws}" followed by a
396+ * comma-separated list of the thrown exception types.
397+ *
398+ * <p>The only possible modifiers for constructors are the access
399+ * modifiers {@code public}, {@code protected} or
400+ * {@code private}. Only one of these may appear, or none if the
401+ * constructor has default (package) access.
402+ *
403+ * @return a string describing this {@code Constructor},
404+ * include type parameters
405+ *
406+ * @since 1.5
407+ */
408+ public String toGenericString() {
409+ try {
410+ StringBuilder sb = new StringBuilder();
411+ int mod = getModifiers() & Modifier.constructorModifiers();
412+ if (mod != 0) {
413+ sb.append(Modifier.toString(mod) + " ");
414+ }
415+ TypeVariable<?>[] typeparms = getTypeParameters();
416+ if (typeparms.length > 0) {
417+ boolean first = true;
418+ sb.append("<");
419+ for(TypeVariable<?> typeparm: typeparms) {
420+ if (!first)
421+ sb.append(",");
422+ // Class objects can't occur here; no need to test
423+ // and call Class.getName().
424+ sb.append(typeparm.toString());
425+ first = false;
426+ }
427+ sb.append("> ");
428+ }
429+ sb.append(Field.getTypeName(getDeclaringClass()));
430+ sb.append("(");
431+ Type[] params = getGenericParameterTypes();
432+ for (int j = 0; j < params.length; j++) {
433+ String param = (params[j] instanceof Class<?>)?
434+ Field.getTypeName((Class<?>)params[j]):
435+ (params[j].toString());
436+ if (isVarArgs() && (j == params.length - 1)) // replace T[] with T...
437+ param = param.replaceFirst("\\[\\]$", "...");
438+ sb.append(param);
439+ if (j < (params.length - 1))
440+ sb.append(",");
441+ }
442+ sb.append(")");
443+ Type[] exceptions = getGenericExceptionTypes();
444+ if (exceptions.length > 0) {
445+ sb.append(" throws ");
446+ for (int k = 0; k < exceptions.length; k++) {
447+ sb.append((exceptions[k] instanceof Class)?
448+ ((Class<?>)exceptions[k]).getName():
449+ exceptions[k].toString());
450+ if (k < (exceptions.length - 1))
451+ sb.append(",");
452+ }
453+ }
454+ return sb.toString();
455+ } catch (Exception e) {
456+ return "<" + e + ">";
457+ }
458+ }
459+
460+ /**
461+ * Uses the constructor represented by this {@code Constructor} object to
462+ * create and initialize a new instance of the constructor's
463+ * declaring class, with the specified initialization parameters.
464+ * Individual parameters are automatically unwrapped to match
465+ * primitive formal parameters, and both primitive and reference
466+ * parameters are subject to method invocation conversions as necessary.
467+ *
468+ * <p>If the number of formal parameters required by the underlying constructor
469+ * is 0, the supplied {@code initargs} array may be of length 0 or null.
470+ *
471+ * <p>If the constructor's declaring class is an inner class in a
472+ * non-static context, the first argument to the constructor needs
473+ * to be the enclosing instance; see section 15.9.3 of
474+ * <cite>The Java&trade; Language Specification</cite>.
475+ *
476+ * <p>If the required access and argument checks succeed and the
477+ * instantiation will proceed, the constructor's declaring class
478+ * is initialized if it has not already been initialized.
479+ *
480+ * <p>If the constructor completes normally, returns the newly
481+ * created and initialized instance.
482+ *
483+ * @param initargs array of objects to be passed as arguments to
484+ * the constructor call; values of primitive types are wrapped in
485+ * a wrapper object of the appropriate type (e.g. a {@code float}
486+ * in a {@link java.lang.Float Float})
487+ *
488+ * @return a new object created by calling the constructor
489+ * this object represents
490+ *
491+ * @exception IllegalAccessException if this {@code Constructor} object
492+ * is enforcing Java language access control and the underlying
493+ * constructor is inaccessible.
494+ * @exception IllegalArgumentException if the number of actual
495+ * and formal parameters differ; if an unwrapping
496+ * conversion for primitive arguments fails; or if,
497+ * after possible unwrapping, a parameter value
498+ * cannot be converted to the corresponding formal
499+ * parameter type by a method invocation conversion; if
500+ * this constructor pertains to an enum type.
501+ * @exception InstantiationException if the class that declares the
502+ * underlying constructor represents an abstract class.
503+ * @exception InvocationTargetException if the underlying constructor
504+ * throws an exception.
505+ * @exception ExceptionInInitializerError if the initialization provoked
506+ * by this method fails.
507+ */
508+ public T newInstance(Object ... initargs)
509+ throws InstantiationException, IllegalAccessException,
510+ IllegalArgumentException, InvocationTargetException
511+ {
512+ if (!override) {
513+ if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
514+ Class<?> caller = Reflection.getCallerClass(2);
515+
516+ checkAccess(caller, clazz, null, modifiers);
517+ }
518+ }
519+ if ((clazz.getModifiers() & Modifier.ENUM) != 0)
520+ throw new IllegalArgumentException("Cannot reflectively create enum objects");
521+ ConstructorAccessor ca = constructorAccessor; // read volatile
522+ if (ca == null) {
523+ ca = acquireConstructorAccessor();
524+ }
525+ return (T) ca.newInstance(initargs);
526+ }
527+
528+ /**
529+ * Returns {@code true} if this constructor was declared to take
530+ * a variable number of arguments; returns {@code false}
531+ * otherwise.
532+ *
533+ * @return {@code true} if an only if this constructor was declared to
534+ * take a variable number of arguments.
535+ * @since 1.5
536+ */
537+ public boolean isVarArgs() {
538+ return (getModifiers() & Modifier.VARARGS) != 0;
539+ }
540+
541+ /**
542+ * Returns {@code true} if this constructor is a synthetic
543+ * constructor; returns {@code false} otherwise.
544+ *
545+ * @return true if and only if this constructor is a synthetic
546+ * constructor as defined by
547+ * <cite>The Java&trade; Language Specification</cite>.
548+ * @since 1.5
549+ */
550+ public boolean isSynthetic() {
551+ return Modifier.isSynthetic(getModifiers());
552+ }
553+
554+ // NOTE that there is no synchronization used here. It is correct
555+ // (though not efficient) to generate more than one
556+ // ConstructorAccessor for a given Constructor. However, avoiding
557+ // synchronization will probably make the implementation more
558+ // scalable.
559+ private ConstructorAccessor acquireConstructorAccessor() {
560+ // First check to see if one has been created yet, and take it
561+ // if so.
562+ ConstructorAccessor tmp = null;
563+ if (root != null) tmp = root.getConstructorAccessor();
564+ if (tmp != null) {
565+ constructorAccessor = tmp;
566+ } else {
567+ // Otherwise fabricate one and propagate it up to the root
568+ tmp = reflectionFactory.newConstructorAccessor(this);
569+ setConstructorAccessor(tmp);
570+ }
571+
572+ return tmp;
573+ }
574+
575+ // Returns ConstructorAccessor for this Constructor object, not
576+ // looking up the chain to the root
577+ ConstructorAccessor getConstructorAccessor() {
578+ return constructorAccessor;
579+ }
580+
581+ // Sets the ConstructorAccessor for this Constructor object and
582+ // (recursively) its root
583+ void setConstructorAccessor(ConstructorAccessor accessor) {
584+ constructorAccessor = accessor;
585+ // Propagate up
586+ if (root != null) {
587+ root.setConstructorAccessor(accessor);
588+ }
589+ }
590+
591+ int getSlot() {
592+ return slot;
593+ }
594+
595+ String getSignature() {
596+ return signature;
597+ }
598+
599+ byte[] getRawAnnotations() {
600+ return annotations;
601+ }
602+
603+ byte[] getRawParameterAnnotations() {
604+ return parameterAnnotations;
605+ }
606+
607+ /**
608+ * @throws NullPointerException {@inheritDoc}
609+ * @since 1.5
610+ */
611+ public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
612+ if (annotationClass == null)
613+ throw new NullPointerException();
614+
615+ return (T) declaredAnnotations().get(annotationClass);
616+ }
617+
618+ /**
619+ * @since 1.5
620+ */
621+ public Annotation[] getDeclaredAnnotations() {
622+ return AnnotationParser.toArray(declaredAnnotations());
623+ }
624+
625+ private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
626+
627+ private synchronized Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
628+ if (declaredAnnotations == null) {
629+ declaredAnnotations = AnnotationParser.parseAnnotations(
630+ annotations, sun.misc.SharedSecrets.getJavaLangAccess().
631+ getConstantPool(getDeclaringClass()),
632+ getDeclaringClass());
633+ }
634+ return declaredAnnotations;
635+ }
636+
637+ /**
638+ * Returns an array of arrays that represent the annotations on the formal
639+ * parameters, in declaration order, of the method represented by
640+ * this {@code Constructor} object. (Returns an array of length zero if the
641+ * underlying method is parameterless. If the method has one or more
642+ * parameters, a nested array of length zero is returned for each parameter
643+ * with no annotations.) The annotation objects contained in the returned
644+ * arrays are serializable. The caller of this method is free to modify
645+ * the returned arrays; it will have no effect on the arrays returned to
646+ * other callers.
647+ *
648+ * @return an array of arrays that represent the annotations on the formal
649+ * parameters, in declaration order, of the method represented by this
650+ * Constructor object
651+ * @since 1.5
652+ */
653+ public Annotation[][] getParameterAnnotations() {
654+ int numParameters = parameterTypes.length;
655+ if (parameterAnnotations == null)
656+ return new Annotation[numParameters][0];
657+
658+ Annotation[][] result = AnnotationParser.parseParameterAnnotations(
659+ parameterAnnotations,
660+ sun.misc.SharedSecrets.getJavaLangAccess().
661+ getConstantPool(getDeclaringClass()),
662+ getDeclaringClass());
663+ if (result.length != numParameters) {
664+ Class<?> declaringClass = getDeclaringClass();
665+ if (declaringClass.isEnum() ||
666+ declaringClass.isAnonymousClass() ||
667+ declaringClass.isLocalClass() )
668+ ; // Can't do reliable parameter counting
669+ else {
670+ if (!declaringClass.isMemberClass() || // top-level
671+ // Check for the enclosing instance parameter for
672+ // non-static member classes
673+ (declaringClass.isMemberClass() &&
674+ ((declaringClass.getModifiers() & Modifier.STATIC) == 0) &&
675+ result.length + 1 != numParameters) ) {
676+ throw new AnnotationFormatError(
677+ "Parameter annotations don't match number of parameters");
678+ }
679+ }
680+ }
681+ return result;
682+ }
683+}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t