2016-10-08 3 views
2

У меня есть проблема, чтобы решить :) Давайте предположим, что у меня есть такая структура:Java Reflection - граф объектов

Интерфейсы:

public interface RestServiceConverter<S, D> { 
    public D convert(S input); 
} 

 

public interface AdvancedRestServiceConverter<D, F, S> extends RestServiceConverter<S, D> { 
} 

Классы:

public class TestConverter extends SecondAbstractLevel<Integer> { 
    @Override 
    public ConvertedResult<String> convert(RawResult input) { 
    return null; 
    } 
} 

 

public abstract class AbstractTestConverter<S, D> extends SecondAbstractLevel { 
} 

 

public abstract class SecondAbstractLevel<T> 
implements AdvancedRestServiceConverter<ConvertedResult<String>, Integer, RawResult> { 
} 

Вопрос: есть ли простой способ найти то, что типы параметров из RestServiceConverter (смотрите, что Params не Явные в этом интерфейсе, но в AdvancedRestServiceConverter в обратном порядке) начиная с TestConverter? Может быть, какая-то библиотека может помочь с этим. Я создаю некоторые функции в своем коде, где мне нужно проверить, является ли поле в каком-то классе тем же, что и второй параметр.

Пусть говорят мне нужен способ, как этот

findParameter(TestConverter.class, RestServiceConverter.class) 

который возвращает массив со

[RawType, ConvertedResult<String>] 

Спасибо за помощь.

+0

Это звучит как замаскированный вариант http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime (и все связанные с этим вопросы) – Marco13

+0

Это не имеет никакого отношения к http://stackoverflow.com/questions/3403909/get- общий тип внеклассного-на-выполнения. Я спрашиваю об обтекании графика объектов и нет библиотеки, как получить тип параметра во время выполнения. – javovy

+0

@javovy На самом деле, вы очень много спрашиваете об общей информации о запуске, и связанный поток имеет ответ. Но ... это довольно сложно справиться с этим самим. См. Мой ответ для более легкого решения. – kaqqao

ответ

0

К сожалению, нет. Java имеет эту довольно неудачную вещь, известную как «стирание типа», что означает, что в вашем байткоде RestServiceConverter<S, D> просто становится RestServiceConverter для любых S и D, которые вы положили туда.

Как много сторонних библиотек обойдется в этом, необходимо, чтобы в реализации были задействованы все необходимые экземпляры Class<?>, чтобы выполнить свою работу.

+0

Не обязательно верно. Во многих случаях информация общего типа фактически сохраняется. Например. общая информация, поступающая из супертипа (точно так, как описано здесь) сохраняется. См. Мой ответ для деталей. – kaqqao

0

Фактически, в вашем конкретном случае это должно быть возможно (если я правильно вас понял). У вас есть супертипы, которые сохранят общую информацию, поэтому стирание вас не беспокоит.

библиотека называется GenTyRef, и мой AnnotatedType -Enabled вилка GeAnTyRef (оба доступны в Maven Central), можно легко получить, что вам нужно:

ParameterizedType exact = (ParameterizedType) GenericTypeReflector.getExactSuperType(TestConverter.class, RestServiceConverter.class); 
Type[] typeParams = exact.getActualTypeArguments(); //returning exactly what you asked for