Получение поля суперкласса с использованием подкласса с использованием отражения - PullRequest
0 голосов
/ 02 июля 2019

По сути, мое требование - получить объект суперкласса с помощью отражения, чтобы я мог получить имя поля и его значение.

, поэтому у меня есть класс

Class Emp {
  private firstName;
  priavte lastName;
}

Class Dept extend Emp {
  private dpFirstName;
  priavte dpLastName;
}

и теперь я использую

emp.getClass.getSuperClass

, который дает мне тип java.lang.Class класса Dept Теперь, когда я пытаюсь получить доступ к полю, используя следующий код.

Class<?> fields = emp.getClass.getSuperClass;
for (Field field : fields.getDeclaredFields()) {
  field.setAccessible(true);             
  System.out.println(field.get(emp.getClass.getSuperClass));
}

Это вызывает у меня исключение, так как

Can not set java.lang.String field com.Dept.dpFirstName to java.lang.Class

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

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Ваша проблема в том, что вы получаете суперкласс для Emp, но не Dept.

Emp emp = new Emp();
Dept dept = new Dept();

Class<?> cls = emp.getClass().getSuperclass(); // it is Class<Object>
Class<?> cls = dept.getClass().getSuperclass(); // it is Class<Emp>

Итак, вы можете использовать следующий фрагмент в качестве правильного примера:

class Emp {
    private String firstName = "first_name";
    private String lastName = "last_name";
}

class Dept extends Emp {
    private String dpFirstName = "dp_first_name";
    private String dpLastName = "dp_last_name";
}

public static void getSuperClassFields(Dept dept) throws IllegalAccessException {
    Class<?> cls = dept.getClass().getSuperclass();

    for (Field field : cls.getDeclaredFields()) {
        field.setAccessible(true);
        System.out.println(field.getName() + " = " + field.get(dept));
    }
}

public static void main(String[] args) throws IllegalAccessException {
    getSuperClassFields(new Dept());
    // in console you can see
    // firstName = first_name
    // lastName = last_name
}
0 голосов
/ 02 июля 2019
public class Emp {

    private String firstName;
    private String lastName;
}

public class Dep extends Emp{

    private String dpFirstName;
    private String dpLastName;
}

public class Main {

    public static void main(String[] args) throws Exception {
        Dep d = new Dep();

        Class<?> c = d.getClass().getSuperclass();

        for (Field field : c.getDeclaredFields()) {
            field.setAccessible(true);
            if(field.getName().equals("firstName")){
                field.set(d, "First Name");
            }
            if(field.getName().equals("lastName")){
                field.set(d, "Last Name");
            }
            System.out.println(field.getName() + "\t" + field.get(d));

        }

    }
}
0 голосов
/ 02 июля 2019

Предполагая, что действительная версия вашего кода выглядит следующим образом:

class Emp {
    private String firstName;
    private String lastName;
}

class Dept extends Emp {
    private String dpFirstName;
    private String dpLastName;
}

Редактировать: Foget о приведении, работает без него.

Class<?> fields = emp.getClass().getSuperclass();

for (Field field : fields.getDeclaredFields()) {
  field.setAccessible(true);             
  System.out.println(field.getName() + "\t" + field.get(emp));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...