Java: получить тип класса возвращаемого объекта универсального поставщика - PullRequest
0 голосов
/ 26 сентября 2018

Давайте предположим, что дано следующее определение:

final Supplier<MyClass> supplier = MyClass::new;

Есть ли способ получить MyClass.class без фактического вызова .get() для поставщика?

Почему?Я должен знать указанный класс, чтобы принять некоторые логические решения.Исходя из этого, мне может понадобиться найти другой конструктор в MyClass, который имеет параметр, и единственное, что я знаю о целевом классе, это поставщик этого типа.Конечно, я мог бы просто вызвать .get() и перейти оттуда так:

final MyClass obj = supplier.get().getClass().getConstructor(MyParameter.class).newInstance(..);

Но использование этого перед выполнением моих промежуточных шагов может привести к ненужному созданию объекта

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете сделать что-то вроде ниже.Необходимо добавить 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());
  }
}
...