package eu.inloop.viewmodel;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
public class ProxyViewHelper {
private static final class ProxyDummyClass {
}
private static final ProxyDummyClass sDummyClass = new ProxyDummyClass();
private static final Class[] sInterfaces = new Class[1];
private ProxyViewHelper() {
}
@SuppressWarnings("unchecked")
@NonNull
static <T> T init(@NonNull Class<?> in) {
sInterfaces[0] = in;
return (T) Proxy.newProxyInstance(sDummyClass.getClass().getClassLoader(), sInterfaces, sInvocationHandler);
}
@Nullable
public static Class<?> getGenericType(@NonNull Class<?> in, @NonNull Class<?> whichExtends) {
final Type genericSuperclass = in.getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType) {
final Type[] typeArgs = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
for (Type arg : typeArgs) {
if (arg instanceof Class<?>) {
final Class<?> argClass = (Class<?>) arg;
if (whichExtends.isAssignableFrom(argClass)) {
return argClass;
}
}
}
}
return null;
}
private static final InvocationHandler sInvocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
};
}