vendredi 12 mars 2021

Java Reflection with arrays based upon inner class definition

Given this Java structure:

class  Master
{
  static class innerThing 
  {
    static StringBuilder  NumOfThings      = new StringBuilder( 2);
    
    static class   Thing_def
    {
      static StringBuilder  field1         = new StringBuilder( 3);
      static StringBuilder  field2         = new StringBuilder( 3);
      static StringBuilder  field3         = new StringBuilder(13);
    }
    
    static Thing_def[]  Things = new Thing_def [2];
    static { for (int i=0; i<Things.length; i++)  Things[i] = new Thing_def();  }
  }
}

Using Reflection in this bit of code:

    Field[] FieldList = DataClass.getDeclaredFields();
    if (0 < FieldList.length )
    {
      SortFieldList( FieldList );

      System.out.println();
      for (Field eachField : FieldList)
       {
         String fldType = new String( eachField.getType().toString() );

         if ( fldType.startsWith("class [L") )
            System.err.printf("\n@@@ fldType= '%s'\n", fldType);  //$$$$$$$$$$$$$$$

         if ( fldType.startsWith("class java.lang.StringBuilder") )
         {
           g_iFieldCnt++;
           String str = DataClass.getName().replaceAll("\\$",".");
           System.out.printf("%s.%s\n", str, eachField.getName() );
         }//endif
       }//endfor
    }//endif

I get the following output: (Notice that it shows one copy of the fields in Thing_def.)

Master.innerThing.NumOfThings

@@@ fldType= 'class [LMaster$innerThing$Thing_def;'

Master.innerThing.Thing_def.field1
Master.innerThing.Thing_def.field2
Master.innerThing.Thing_def.field3

In another part of the system I access the fields to generate a CSV file:

    Field[] FieldList = DataClass.getDeclaredFields();

    if (0 < FieldList.length )
    {
      for (Field eachField : FieldList)
       {
         String fldType = new String( eachField.getType().toString() );

         if ( fldType.startsWith("class java.lang.StringBuilder") )
         {
           Field  fld = DataClass.getDeclaredField( eachField.getName() );
           StringBuilder sb = (StringBuilder)fld.get(null);

           CSV_file.printf("%s,", sb );   // emit column to CSV
    
           //fld.set( DataClass, new StringBuilder() );
         }//endif

       }//endfor
       
    }//endif

So in this case I actually will need to directly access array elements.
That is, I need to get at each Master.innerThing.Thing[n].field

So, the big question is:

How do I generically access arrays like this ?

How do I know that Thing_def does not have data, it is merely a structural definition for Things[ ] ?





Aucun commentaire:

Enregistrer un commentaire