
net.vidageek.mirror.invoke.DefaultInvocationHandler Maven / Gradle / Ivy
package net.vidageek.mirror.invoke;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import net.vidageek.mirror.bean.Bean;
import net.vidageek.mirror.dsl.Mirror;
import net.vidageek.mirror.invoke.dsl.ConstructorHandler;
import net.vidageek.mirror.invoke.dsl.InvocationHandler;
import net.vidageek.mirror.invoke.dsl.MethodHandler;
import net.vidageek.mirror.invoke.dsl.SetterMethodHandler;
import net.vidageek.mirror.provider.ReflectionProvider;
/**
* This class is responsible for choosing between invocation of constructor or
* methods.
*
* @author jonasabreu
*/
public final class DefaultInvocationHandler implements InvocationHandler {
private final Object target;
private final Class> clazz;
private final ReflectionProvider provider;
public DefaultInvocationHandler(final ReflectionProvider provider, final Object target) {
if (target == null) {
throw new IllegalArgumentException("target can't be null");
}
this.provider = provider;
this.target = target;
clazz = target.getClass();
}
public DefaultInvocationHandler(final ReflectionProvider provider, final Class target) {
if (target == null) {
throw new IllegalArgumentException("target can't be null");
}
this.provider = provider;
clazz = target;
this.target = null;
}
public MethodHandler method(final String methodName) {
if (methodName == null) {
throw new IllegalArgumentException("methodName can't be null");
}
return new MethodHandlerByName(provider, target, clazz, methodName);
}
@SuppressWarnings("unchecked")
public ConstructorHandler constructor() {
if (this.target != null) {
throw new IllegalStateException(
"must use constructor InvocationHandler(Class) instead of InvocationHandler(Object).");
}
return new ConstructorHandlerByArgs(provider, (Class) clazz);
}
public MethodHandler method(final Method method) {
return new MethodHandlerByMethod(provider, target, clazz, method);
}
@SuppressWarnings("unchecked")
public ConstructorHandler constructor(final Constructor con) {
return new ConstructorHandlerByConstructor(provider, clazz, con);
}
public Object getterFor(final String fieldName) {
return new Mirror(provider).on(target).invoke().method(new Bean().getter(fieldName)).withoutArgs();
}
public Object getterFor(final Field field) {
return getterFor(field.getName());
}
public SetterMethodHandler setterFor(final String fieldName) {
return new DefaultSetterMethodHandler(provider, target, fieldName);
}
public SetterMethodHandler setterFor(final Field field) {
return setterFor(field.getName());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy