public Object getProperty( Object root, String propName ) throws Exception {
    List<Integer> extractedIndexes = new ArrayList<>();

    BeanInjectionInfo.Property prop = info.getProperties().get( propName );
    if ( prop == null ) {
      throw new RuntimeException( "Property not found" );
    }

    Object obj = root;
    for ( int i = 1, arrIndex = 0; i < prop.path.size(); i++ ) {
      BeanLevelInfo s = prop.path.get( i );
      obj = s.field.get( obj );
      if ( obj == null ) {
        return null; // some value in path is null - return empty
      }

      switch ( s.dim ) {
        case ARRAY:
          int indexArray = extractedIndexes.get( arrIndex++ );
          if ( Array.getLength( obj ) <= indexArray ) {
            return null;
          }
          obj = Array.get( obj, indexArray );
          if ( obj == null ) {
            return null; // element is empty
          }
          break;
        case LIST:
          int indexList = extractedIndexes.get( arrIndex++ );
          List<?> list = (List<?>) obj;
          if ( list.size() <= indexList ) {
            return null;
          }
          obj = list.get( indexList );
          if ( obj == null ) {
            return null; // element is empty
          }
          break;
        case NONE:
          break;
      }
    }
    return obj;
  }
@Test
  public void getProperty_Found() {
    BeanInjector bi = new BeanInjector(null );
    BeanInjectionInfo bii = new BeanInjectionInfo( MetaBeanLevel1.class );
    BeanInjectionInfo.Property actualProperty = bi.getProperty( bii, "SEPARATOR" );

    assertNotNull(actualProperty);
    assertEquals("SEPARATOR", actualProperty.getName() );
  }