4 Ekim 2018 Perşembe

TypeToken Sınıfı

Giriş
Şu satırı dahil ederiz.
import com.google.common.reflect.TypeToken;
Açıklaması şöyle.
We can use the TypeToken class to capture an actual type of generic list and check if they really can be referenced by the same reference
constructor
Örnek
Şöyle yaparız.
TypeToken<?> propTt = new TypeToken<List<? extends Number>>() {};
getTypes metodu
Şöyle yaparız.
final Set<TypeToken> tt = TypeToken.of(cls).getTypes().interfaces();
isSupertypeOf metodu
Şöyle yaparız.
private static boolean isAssignable(TypeToken<?> resolved, Class<?> implClass) {
    return resolved.isSupertypeOf(implClass) || 
           isAnySupertypeAssignable(resolved, implClass);
}

private static boolean isAnySupertypeAssignable(TypeToken<?> resolved,
                                                Class<?> implClass) {
    return TypeToken.of(implClass).getTypes().stream()
            .anyMatch(supertype -> isUncheckedSupertype(resolved, supertype));
}

private static boolean isUncheckedSupertype(TypeToken<?> resolved,
                                            TypeToken<?> implTypeToken) {
    if (implTypeToken.getType() instanceof ParameterizedType) {
        return false; 
       // this prevents assignments of Collection<Integer> to Collection<Timestamp>
    }
  try {
    resolved.getSubtype(implTypeToken.getRawType());
    return true;
  } catch (IllegalArgumentException ex) {
    return false;
  }
}
resolveType metodu
Örnek
Elimizde generic bir kod olsun
package net.redpoint.scratch;
public class Base<E> {
    public E getE() { return null; }
}
Generic tipi gerçekleştiren bir sınıf olsun
public class Derived extends Base<String> {}
Kalıtan sınıfın getE metodunun hangi parametre olduğunu bulmak için şöyle yaparız.
Type returnType =
    new TypeToken<Derived>() {}
        .resolveType(Base.class.getMethod("getE").getGenericReturnType());



Hiç yorum yok:

Yorum Gönder