All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.inject.internal.SingleMethodInjector Maven / Gradle / Ivy

package com.google.inject.internal;

import com.google.inject.internal.InjectorImpl.MethodInvoker;
import com.google.inject.spi.InjectionPoint;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * Invokes an injectable method.
 */
final class SingleMethodInjector implements SingleMemberInjector {
    private final MethodInvoker methodInvoker;
    private final SingleParameterInjector[] parameterInjectors;
    private final InjectionPoint injectionPoint;

    SingleMethodInjector(InjectorImpl injector, InjectionPoint injectionPoint, Errors errors)
            throws ErrorsException {
        this.injectionPoint = injectionPoint;
        final Method method = (Method) injectionPoint.getMember();
        methodInvoker = createMethodInvoker(method);
        parameterInjectors = injector.getParametersInjectors(injectionPoint.getDependencies(), errors);
    }

    private MethodInvoker createMethodInvoker(final Method method) {
        int modifiers = method.getModifiers();
        if (!Modifier.isPublic(modifiers) ||
                !Modifier.isPublic(method.getDeclaringClass().getModifiers())) {
            method.setAccessible(true);
        }
        return method::invoke;
    }

    public InjectionPoint getInjectionPoint() {
        return injectionPoint;
    }

    @Override
    public void inject(InternalContext context, Object o) throws InternalProvisionException {
        Object[] parameters = SingleParameterInjector.getAll(context, parameterInjectors);
        try {
            methodInvoker.invoke(o, parameters);
        } catch (IllegalAccessException e) {
            throw new AssertionError(e); // a security manager is blocking us, we're hosed
        } catch (InvocationTargetException userException) {
            Throwable cause = userException.getCause() != null ? userException.getCause() : userException;
            throw InternalProvisionException.errorInjectingMethod(cause).addSource(injectionPoint);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy