当class1对象通过反射在另一个class2中私有声明时,如何访问class1的私有变量的值?

时间:2016-10-29 15:48:30

标签: java reflection

我试图在将课程作为一个对象运行后访问部门的私人领域。部门当然是一个私人变量。 解决方案需要是通用的,因为这是一个反思练习。在运行时,存储对象函数不知道传递了哪种类型的对象,因此我也不能使用类型转换。 这是部门类:

public class Department{
  private String departmentName;
  private Teacher departmentHOD;
}

这是课程课程:

public class Course {
  private String courseNumber;
  private String semesterName;
  private String courseName;
  private Department offeringDepartment;
  private Teacher[] courseInstructors;
  private int sectionNumbers;
}

在main中我在函数void storeObject(Object o)中传递过程:

void storeObject(Object o)
{
 //in this function i need to extract all possible primitive datatype objects and save them in a data base
Class classForStorage = o.getClass();
Field[] publicFields = classForStorage.getDeclaredFields();//.getFields()
    for (int i = 0; i < publicFields.length; i++) 
    {   //  making private ones accessible
        publicFields[i].setAccessible(true);
        //Getting name and type of all attributes in the class one by one
        String fieldName = publicFields[i].getName();
        Class typeClass = publicFields[i].getType();
        String fieldType = typeClass.getName();
       ......//after this i access values by datatype and store in sql
       //but it only works for primitive data types
    }

我无法使用以下内容访问昵称:

  publicFields[i].getType().getDeclaredFields()[0].setAccessible(true);
  value =(String)publicFields[i].getType().getDeclaredFields()[0].get(obj); 

这给了我非法访问异常

另外注意如何从courseInstructor数组中获取值。

2 个答案:

答案 0 :(得分:0)

修改:&#34;通过反思&#34;在发布此答案后添加到问题标题中。如果解决方案必须使用反射,则此答案不适用。

您寻求的通用解决方案是:

 public class Course {
   private String courseNumber;
   private String semesterName;
   private String courseName;
   private Department offeringDepartment;
   private Teacher[] courseInstructors;
   private int sectionNumbers;

   //add a getter to Course 
   public Department getDepartment() {
     return offeringDepartment
   }
}

检索部门使用

Course course = new Course();
Department department = course.getDepartment();

如果&#39; o&#39; object是&#39; Course&#39;的一个实例。你可以:

//cast object to Course and use getter 
((Course)o).getDepartment();

答案 1 :(得分:0)

你过分思考这个。

void printObject( Object o ) {
    for ( Field fld : o.getClass().getDeclaredFields() ) {
        fld.setAccessible( true );
        System.out.println( fld.get( o ) );
    }
}

如果字段是数组,如果您需要使用不同的方法,请使用isArray

void printObject( Object o ) {
    for ( Field fld : o.getClass().getDeclaredFields() ) {
        fld.setAccessible( true );
        Object oFldVal = fld.get( o );
        if ( fld.getType().isArray() ) {
            int iLen = Arrays.getLength( oFldVal );
            for ( int i = 0; i < iLen; ++i ) {
                printObject( Arrays.get( oFldVal, i ) );
            }
        } else {
            System.println( oFldVal );
        }
    }
}