Tobias Würth:
Vamos a suponer que se da la siguiente definición:
final Supplier<MyClass> supplier = MyClass::new;
¿Hay una manera que puedo conseguir MyClass.class
sin tener que invocar .get()
en el proveedor?
¿Por qué? Tengo que saber la clase especificada que tomar algunas decisiones lógicas. En base a esto, puede ser que necesite para encontrar otro constructor en MyClass
el que tiene un parámetro y el único conocimiento que tengo de la clase de destino es un proveedor de este tipo. Por supuesto que podría simplemente invocar .get()
e ir de allí, así:
final MyClass obj = supplier.get().getClass().getConstructor(MyParameter.class).newInstance(..);
Pero el uso de este antes de hacer mis pasos intermedios podría dar lugar a una creación de objetos innecesarios
Diego Marín:
Usted puede hacer algo, como a continuación. Es necesario añadir guayaba como dependencia.
import java.lang.reflect.Type;
import java.util.function.Supplier;
import com.google.common.reflect.TypeToken;
public abstract class MySupplier<T> implements Supplier<T> {
private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) { };
private final Type type = typeToken.getType();
public Type getType() {
return type;
}
}
public class Test {
public static void main(String[] args) {
Supplier<String> supplier = new MySupplier<String>() {
@Override
public String get() {
return new String();
}
};
System.out.println(((MySupplier) supplier).getType());
}
}