为了账号安全,请及时绑定邮箱和手机立即绑定

使用反射使用子类获取超类字段

使用反射使用子类获取超类字段

万千封印 2023-03-02 14:56:37
基本上,我的要求是通过使用反射获取超类对象,以便我可以获得字段名称及其值。所以,我有一个类Class Emp {  private firstName;  priavte lastName;}Class Dept extend Emp {  private dpFirstName;  priavte dpLastName;}现在正在使用emp.getClass.getSuperClass这给了我 Dept 类的 java.lang.Class 类型 现在,当我尝试使用以下代码访问该字段时。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 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

您的问题是您获得了超类,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

}


查看完整回答
反对 回复 2023-03-02
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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));


        }


    }

}


查看完整回答
反对 回复 2023-03-02
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

假设您的代码的有效版本如下所示:


class Emp {

    private String firstName;

    private String lastName;

}


class Dept extends Emp {

    private String dpFirstName;

    private String dpLastName;

}

编辑:忘记演员表,没有它就可以工作。


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


for (Field field : fields.getDeclaredFields()) {

  field.setAccessible(true);             

  System.out.println(field.getName() + "\t" + field.get(emp));

}


查看完整回答
反对 回复 2023-03-02
  • 3 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信