|
|
|
@ -47,22 +47,22 @@ public class MethodParameter { |
|
|
|
|
|
|
|
|
|
private final int parameterIndex; |
|
|
|
|
|
|
|
|
|
private Class<?> containingClass; |
|
|
|
|
private int nestingLevel = 1; |
|
|
|
|
|
|
|
|
|
private Class<?> parameterType; |
|
|
|
|
/** Map from Integer level to Integer type index */ |
|
|
|
|
Map<Integer, Integer> typeIndexesPerLevel; |
|
|
|
|
|
|
|
|
|
private Type genericParameterType; |
|
|
|
|
private volatile Class<?> containingClass; |
|
|
|
|
|
|
|
|
|
private Annotation[] parameterAnnotations; |
|
|
|
|
private volatile Class<?> parameterType; |
|
|
|
|
|
|
|
|
|
private ParameterNameDiscoverer parameterNameDiscoverer; |
|
|
|
|
private volatile Type genericParameterType; |
|
|
|
|
|
|
|
|
|
private String parameterName; |
|
|
|
|
private volatile Annotation[] parameterAnnotations; |
|
|
|
|
|
|
|
|
|
private int nestingLevel = 1; |
|
|
|
|
private volatile ParameterNameDiscoverer parameterNameDiscoverer; |
|
|
|
|
|
|
|
|
|
/** Map from Integer level to Integer type index */ |
|
|
|
|
Map<Integer, Integer> typeIndexesPerLevel; |
|
|
|
|
private volatile String parameterName; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -203,6 +203,73 @@ public class MethodParameter { |
|
|
|
|
return this.parameterIndex; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Increase this parameter's nesting level. |
|
|
|
|
* @see #getNestingLevel() |
|
|
|
|
*/ |
|
|
|
|
public void increaseNestingLevel() { |
|
|
|
|
this.nestingLevel++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Decrease this parameter's nesting level. |
|
|
|
|
* @see #getNestingLevel() |
|
|
|
|
*/ |
|
|
|
|
public void decreaseNestingLevel() { |
|
|
|
|
getTypeIndexesPerLevel().remove(this.nestingLevel); |
|
|
|
|
this.nestingLevel--; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the nesting level of the target type |
|
|
|
|
* (typically 1; e.g. in case of a List of Lists, 1 would indicate the |
|
|
|
|
* nested List, whereas 2 would indicate the element of the nested List). |
|
|
|
|
*/ |
|
|
|
|
public int getNestingLevel() { |
|
|
|
|
return this.nestingLevel; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Set the type index for the current nesting level. |
|
|
|
|
* @param typeIndex the corresponding type index |
|
|
|
|
* (or {@code null} for the default type index) |
|
|
|
|
* @see #getNestingLevel() |
|
|
|
|
*/ |
|
|
|
|
public void setTypeIndexForCurrentLevel(int typeIndex) { |
|
|
|
|
getTypeIndexesPerLevel().put(this.nestingLevel, typeIndex); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the type index for the current nesting level. |
|
|
|
|
* @return the corresponding type index, or {@code null} |
|
|
|
|
* if none specified (indicating the default type index) |
|
|
|
|
* @see #getNestingLevel() |
|
|
|
|
*/ |
|
|
|
|
public Integer getTypeIndexForCurrentLevel() { |
|
|
|
|
return getTypeIndexForLevel(this.nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the type index for the specified nesting level. |
|
|
|
|
* @param nestingLevel the nesting level to check |
|
|
|
|
* @return the corresponding type index, or {@code null} |
|
|
|
|
* if none specified (indicating the default type index) |
|
|
|
|
*/ |
|
|
|
|
public Integer getTypeIndexForLevel(int nestingLevel) { |
|
|
|
|
return getTypeIndexesPerLevel().get(nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Obtain the (lazily constructed) type-indexes-per-level Map. |
|
|
|
|
*/ |
|
|
|
|
private Map<Integer, Integer> getTypeIndexesPerLevel() { |
|
|
|
|
if (this.typeIndexesPerLevel == null) { |
|
|
|
|
this.typeIndexesPerLevel = new HashMap<Integer, Integer>(4); |
|
|
|
|
} |
|
|
|
|
return this.typeIndexesPerLevel; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Set a containing class to resolve the parameter type against. |
|
|
|
|
*/ |
|
|
|
@ -364,10 +431,10 @@ public class MethodParameter { |
|
|
|
|
* has been set to begin with) |
|
|
|
|
*/ |
|
|
|
|
public String getParameterName() { |
|
|
|
|
if (this.parameterNameDiscoverer != null) { |
|
|
|
|
ParameterNameDiscoverer discoverer = this.parameterNameDiscoverer; |
|
|
|
|
if (discoverer != null) { |
|
|
|
|
String[] parameterNames = (this.method != null ? |
|
|
|
|
this.parameterNameDiscoverer.getParameterNames(this.method) : |
|
|
|
|
this.parameterNameDiscoverer.getParameterNames(this.constructor)); |
|
|
|
|
discoverer.getParameterNames(this.method) : discoverer.getParameterNames(this.constructor)); |
|
|
|
|
if (parameterNames != null) { |
|
|
|
|
this.parameterName = parameterNames[this.parameterIndex]; |
|
|
|
|
} |
|
|
|
@ -376,82 +443,17 @@ public class MethodParameter { |
|
|
|
|
return this.parameterName; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Increase this parameter's nesting level. |
|
|
|
|
* @see #getNestingLevel() |
|
|
|
|
*/ |
|
|
|
|
public void increaseNestingLevel() { |
|
|
|
|
this.nestingLevel++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Decrease this parameter's nesting level. |
|
|
|
|
* @see #getNestingLevel() |
|
|
|
|
*/ |
|
|
|
|
public void decreaseNestingLevel() { |
|
|
|
|
getTypeIndexesPerLevel().remove(this.nestingLevel); |
|
|
|
|
this.nestingLevel--; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the nesting level of the target type |
|
|
|
|
* (typically 1; e.g. in case of a List of Lists, 1 would indicate the |
|
|
|
|
* nested List, whereas 2 would indicate the element of the nested List). |
|
|
|
|
*/ |
|
|
|
|
public int getNestingLevel() { |
|
|
|
|
return this.nestingLevel; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Set the type index for the current nesting level. |
|
|
|
|
* @param typeIndex the corresponding type index |
|
|
|
|
* (or {@code null} for the default type index) |
|
|
|
|
* @see #getNestingLevel() |
|
|
|
|
*/ |
|
|
|
|
public void setTypeIndexForCurrentLevel(int typeIndex) { |
|
|
|
|
getTypeIndexesPerLevel().put(this.nestingLevel, typeIndex); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the type index for the current nesting level. |
|
|
|
|
* @return the corresponding type index, or {@code null} |
|
|
|
|
* if none specified (indicating the default type index) |
|
|
|
|
* @see #getNestingLevel() |
|
|
|
|
*/ |
|
|
|
|
public Integer getTypeIndexForCurrentLevel() { |
|
|
|
|
return getTypeIndexForLevel(this.nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the type index for the specified nesting level. |
|
|
|
|
* @param nestingLevel the nesting level to check |
|
|
|
|
* @return the corresponding type index, or {@code null} |
|
|
|
|
* if none specified (indicating the default type index) |
|
|
|
|
*/ |
|
|
|
|
public Integer getTypeIndexForLevel(int nestingLevel) { |
|
|
|
|
return getTypeIndexesPerLevel().get(nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Obtain the (lazily constructed) type-indexes-per-level Map. |
|
|
|
|
*/ |
|
|
|
|
private Map<Integer, Integer> getTypeIndexesPerLevel() { |
|
|
|
|
if (this.typeIndexesPerLevel == null) { |
|
|
|
|
this.typeIndexesPerLevel = new HashMap<Integer, Integer>(4); |
|
|
|
|
} |
|
|
|
|
return this.typeIndexesPerLevel; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public boolean equals(Object obj) { |
|
|
|
|
if (this == obj) { |
|
|
|
|
public boolean equals(Object other) { |
|
|
|
|
if (this == other) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
if (obj != null && obj instanceof MethodParameter) { |
|
|
|
|
MethodParameter other = (MethodParameter) obj; |
|
|
|
|
return (this.parameterIndex == other.parameterIndex && getMember().equals(other.getMember())); |
|
|
|
|
if (!(other instanceof MethodParameter)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
MethodParameter otherParam = (MethodParameter) other; |
|
|
|
|
return (this.parameterIndex == otherParam.parameterIndex && getMember().equals(otherParam.getMember())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|