【问题标题】:Getting the super class field using subclass using reflection使用反射使用子类获取超类字段
【发布时间】:2019-07-02 20:57:34
【问题描述】:

基本上,我的要求是通过使用反射来获取超类对象,以便我可以获取字段名称及其值。

所以, 我有一门课

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

谁能帮我把它转换成一个对象,以便我可以访问该文件

【问题讨论】:

  • 发布您的实际代码。 emp.getClass.getSuperClass; 无效。
  • Class Dept extend Emp 也不编译。

标签: java reflection


【解决方案1】:
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));

        }

    }
}

【讨论】:

    【解决方案2】:

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

    所以,你可以使用下面的 sn-p 作为正确的例子:

    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
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • oleg cherednik 是对的,但实际上不需要演员阵容。所以我假设在某个地方你改变了你的代码来处理类 Dept 而不是 Emp。
      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      相关资源
      最近更新 更多