in src/main/java/org/apache/commons/jexl3/internal/introspection/Introspector.java [150:216]
public Constructor<?> getConstructor(final Class<?> c, final MethodKey key) {
Constructor<?> ctor;
lock.readLock().lock();
try {
ctor = constructorsMap.get(key);
if (ctor != null) {
// miss or not?
return CTOR_MISS.equals(ctor) ? null : ctor;
}
} finally {
lock.readLock().unlock();
}
// let's introspect...
lock.writeLock().lock();
try {
// again for kicks
ctor = constructorsMap.get(key);
if (ctor != null) {
// miss or not?
return CTOR_MISS.equals(ctor) ? null : ctor;
}
final String constructorName = key.getMethod();
// do we know about this class?
Class<?> clazz = constructibleClasses.get(constructorName);
try {
// do find the most specific ctor
if (clazz == null) {
if (c != null && c.getName().equals(key.getMethod())) {
clazz = c;
} else {
clazz = loader.loadClass(constructorName);
}
// add it to list of known loaded classes
constructibleClasses.put(constructorName, clazz);
}
final List<Constructor<?>> l = new ArrayList<>();
for (final Constructor<?> ictor : clazz.getConstructors()) {
if (permissions.allow(ictor)) {
l.add(ictor);
}
}
// try to find one
ctor = key.getMostSpecificConstructor(l.toArray(new Constructor<?>[0]));
if (ctor != null) {
constructorsMap.put(key, ctor);
} else {
constructorsMap.put(key, CTOR_MISS);
}
} catch (final ClassNotFoundException xnotfound) {
if (logger != null && logger.isDebugEnabled()) {
logger.debug("unable to find class: "
+ constructorName + "."
+ key.debugString(), xnotfound);
}
} catch (final MethodKey.AmbiguousException xambiguous) {
if (logger != null && xambiguous.isSevere() && logger.isInfoEnabled()) {
logger.info("ambiguous constructor invocation: "
+ constructorName + "."
+ key.debugString(), xambiguous);
}
ctor = null;
}
return ctor;
} finally {
lock.writeLock().unlock();
}
}