public Constructor getConstructor()

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();
        }
    }