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

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