Java getMethod () с универсальным классом - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь получить метод из интерфейса.
Я читал о функции getMethod (), и, как сказано в документе,

public Method getMethod(String name, Class<?>... parameterTypes)

- это объявление для java.lang.Class.getMethod ().Метод

У меня нет проблем с методами, которые простые типы вроде

Call<ApiR<SelfVM>> Get(String value);  

здесь передают String.class работает правильно


но когда методу нужен универсальный класс , я немного запутался в этом, и

вот мой вопрос

чтоесли я передам вместо parameterTypes в таких методах, как

Call<ApiR<SelfVM>> Set(SendR<SelfVM> vm);

SendR и SelfVM классы

public class SendR <T> {

    private T value;
    private String token;

    public SendR(T value, String token) {
        this.value = value;
        this.token = token;
    }

}

public class SelfVM {

    private String id;
    private String name;
    private String lastName;

    public SelfVM(String id, String name, String lastName) {
        this.id = id;
        this.name = name;
        this.lastName = lastName;
    }

}

и вот что я попробовал

Функция CalculateResult:

protected static void CalculateResult(final Object interfaceObject,
                                      final String methodName,
                                      final Class<?> viewModelClassType,
                                      final Object viewModelObject,
                                      final CalculateResultCallBack callBack) {
    Method method;
    Call<ApiR> result = null;
    method = interfaceObject
          .getClass()
          .getMethod(methodName, viewModelClassType);
    result = (Call<ApiR>) method.invoke(interfaceObject, viewModelObject);
}

и здесьэто где я вызываю функцию CalculateResult

static SelfInterface apiService =
        ApiSetting.getClient().create(SelfInterface.class);

public static void get(CalculateResultCallBack<SelfVM> callBack) {
    CalculateResult(apiService, "Get", null,
            null, callBack);
}

public static void set(SendR<SelfVM> vm, CalculateResultCallBack<SelfVM> callBack) {
    CalculateResult(apiService, "Set", SendR.class, vm, callBack);
}

ApiSetting.getClient ()

public class ApiSetting {
    public static Retrofit getClient() {
            if (retrofit == null) {
                retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(okHttpClient)
                        .build();
            }
            return retrofit;
        }
}

получить и установить методы

@GET("json.txt")
Call<ApiR<SelfVM>> Get();


@PUT("json.txt")
Call<ApiR<SelfVM>> Set(SendR<SelfVM> vm);
...