ProjectAres/Util/core/src/main/java/tc/oc/commons/core/inject/InjectionChecks.java

27 lines
1.1 KiB
Java

package tc.oc.commons.core.inject;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import com.google.inject.spi.InjectionPoint;
import tc.oc.commons.core.reflect.MethodFormException;
public class InjectionChecks {
public static void checkInjectableCGLibProxyBase(Class<?> cls) {
InjectionPoint.forInstanceMethodsAndFields(cls).forEach(ip -> {
if(ip.getMember() instanceof Method && !Modifier.isPrivate(ip.getMember().getModifiers())) {
// CGLib proxies override all non-private methods on the base class,
// and do not copy method annotations, so Guice will not find the
// @Inject annotation on the base method. Declaring the method
// private works around this. The proxy will not try to override
// private methods, and Guice can find them just fine.
throw new MethodFormException(
(Method) ip.getMember(),
"Injected method on CGLib proxied class must be private (see exception site for details)"
);
}
});
}
}