Как получить общий тип списка - PullRequest
0 голосов
/ 08 мая 2019

Я использую библиотеку BCEL для анализа некоторого кода. Я столкнулся с методом (getAllNames()), тип возвращаемого значения которого List< Name >. Я хочу иметь возможность получить тип возвращаемого значения этого метода.

Я хочу получить полный класс «Имя».

Я пытался использовать метод < Instruction.getReturnType() > в своем классе посетителя метода, но для этого конкретного метода я получаю результат "java.util.List". Вместо этого я хочу использовать универсальный тип "com.instant.Name".

Подпись для метода выглядит так:

public List<Name> getAllNames() {
...
}

У меня также есть объект org.apache.bcel.generic.MethodGen, который я создаю перед посещением метода с помощью org.apache.bcel.classfile.Method

Когда я пытаюсь получить возвращаемый тип, он снова выдает "java.util.List"

Я ожидаю, что вывод метода MethodGen.getReturnType () будет "com.instant.Name", но фактический вывод будет "java.util.List"

1 Ответ

0 голосов
/ 09 мая 2019

Вопреки некоторым комментариям информация, очевидно, существует, стирание типов не происходит на уровне интерфейса - так же, как Eclipse / NetBeans / IntelliJ / и т.д.вы можете получить точный тип / тип возвращаемых членов класса, вы тоже можете это сделать:

public class Name {
  public List<Name> getAllNames(){return null;}

  public static void main(String[] args) throws Exception {
    Method m=Name.class.getMethod("getAllNames");
    ParameterizedType pt=(ParameterizedType)m.getGenericReturnType();
    System.out.println(pt.getActualTypeArguments()[0]);
  }
}

BCEL - это еще одна история, я не знаком с ней, однако самый конец FieldOrMethod.java, есть метод с именем getGenericSignature().Вы можете уже найти это полезным (хотя, по-видимому, он генерирует подпись), или вы можете повторить цикл внутри, через attributes (вы можете получить их через getAttributes()), проверяя наличие instanceof Signature:

Attribute a[]=m.getAttributes(); // where is the org.apache.bcel.classfile.Method you have
for(int i=0;i<a.length;i++)
  if(a[i] instanceof Signature)
    System.out.println(a[i]); // this is just a test of course.

Реальный код предполагает, что такой атрибут может быть только один, и цикл может завершиться впоследствии, но это заставило меня задуматься о типах, имеющих несколько параметров, например Map -s ...
getGenericSignature() сам по себе не встречается нигде (ни проверен, ни использован), поэтому я могу только надеяться, что он (и, следовательно, описанный выше подход) действительно работает.

...