Ошибка чтения полей класса с помощью Reflection - PullRequest
1 голос
/ 28 марта 2019

У меня очень странный случай декомпиляции класса.

У класса есть три поля:

private String descError;
private Number codError;
private List<String> errorList;

Когда я декомпилирую класс с помощью FernFlower или JDGui, я вижу три полябез проблем, но когда я загружаю .jar, содержащий класс, в мой classLoader, этот класс имеет «Map» вместо «List».

Я получаю:

java.lang.reflect.Field

С этими свойствами:

Подпись: Ljava/util/Map<Ljava/lang/Object;Ljava/lang/Object;>;

Тип: interface java.util.Map

Класс: Myclass

Каждый знает, что может быть причинойэтот странный случай?

Вот мой код:

private List<MyObjects> loadClass(String clazz, URLClassLoader completeClassLoader) {
    Class<?> loadClass = completeClassLoader.loadClass(clazz);
    Field[] classFields = loadClass.getDeclaredFields();
    for(Field fAux : classFields) {
        //My code
    }
}

loadClass.getDeclaredFields возвращает этот массив типов:

[
private java.lang.String MyClass.fieldName1, 
private java.lang.Number MyClass.fieldName2, 
private java.util.Map MyClass.fieldName3
]

Вместо реальных типов:

[
private java.lang.String MyClass.fieldName1, 
private java.lang.Number MyClass.fieldName2, 
private java.util.List MyClass.fieldName3
]

Ответы [ 2 ]

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

@ christiaan ответ в порядке.Но я немного изменил ваш метод, и я получил правильные типы:

private java.lang.String TestClass.descErrorprivate 
java.lang.Number TestClass.codErrorprivate 
java.util.List TestClass.errorList

private void loadClass(final String clazz) throws ClassNotFoundException {
   final Class<?> loadClass = ClassLoader.getSystemClassLoader().loadClass(clazz);
   final Field[] classFields = loadClass.getDeclaredFields();
   for (final Field fAux : classFields) {
      System.out.printf("%s", fAux);
   }
}
0 голосов
/ 28 марта 2019

Вы можете попробовать это

public static void run(String[] args) throws ClassNotFoundException {
    Class clazz = Class.forName("com.testing.reflection.MyClass");// this is where you would specify which class you want, use your own method to plugin the string, it needs to be the full package along with the class name
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
        String modifierType = Modifier.toString(field.getModifiers()) + " ";//this will return the modifier each field has in the class
        String fieldType = field.getType().getSimpleName() + " ";// this will return the data type of each field in the class
        System.out.println(modifierType + fieldType + field.getName() + "\n");// field.getName() will return the name of each field in the class
    }
}

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

private String descError

private Number codError

private List errorList
...