Java: получить тип класса возвращаемого объекта универсального поставщика
Давайте предположим, что дано следующее определение:
final Supplier<MyClass> supplier = MyClass::new;
Есть ли способ, которым я могу получить MyClass.class
без фактического вызова .get()
на поставщика?
Зачем? Я должен знать указанный класс, чтобы принять некоторые логические решения. Исходя из этого, мне может понадобиться найти другой конструктор в MyClass
который имеет параметр и единственное знание о целевом классе, которое у меня есть, это поставщик такого типа. Конечно, я мог бы просто призвать .get()
и идти оттуда, как это:
final MyClass obj = supplier.get().getClass().getConstructor(MyParameter.class).newInstance(..);
Но использование этого перед выполнением моих промежуточных шагов может привести к ненужному созданию объекта
1 ответ
Решение
Вы можете сделать что-то вроде ниже. Необходимо добавить Guava в качестве зависимости.
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());
}
}