@Documented
 @Retention(value=SOURCE)
 @Target(value=FIELD)
public @interface IndexedProperty
Example usage: suppose you have a class with the following properties:
will add the following methods to the class containing the properties:@IndexedPropertyFieldType[] someField@IndexedPropertyListotherField @IndexedPropertyList furtherField
 FieldType getSomeField(int index) {
     someField[index]
 }
 FieldType getOtherField(int index) {
     otherField[index]
 }
 Object getFurtherField(int index) {
     furtherField[index]
 }
 void setSomeField(int index, FieldType val) {
     someField[index] = val
 }
 void setOtherField(int index, FieldType val) {
     otherField[index] = val
 }
 void setFurtherField(int index, Object val) {
     furtherField[index] = val
 }
 
 Normal Groovy visibility rules for properties apply
 (i.e. no public, private or package
 visibility can be specified) or you will receive a compile-time error message.
 The normal Groovy property getters and setters will also be created.
 
More examples:
 import groovy.transform.IndexedProperty
 class Group {
     String name
     List members = []
 }
 class IndexedGroup {
     String name
     @IndexedProperty List members = []
 }
 def group = new Group(name: 'Groovy')
 group.members[0] = 'mrhaki'
 group.members[1] = 'Hubert'
 assert 2 == group.members.size()
 assert ['mrhaki', 'Hubert'] == group.members
 try {
     group.setMembers(0, 'hubert') // Not index property
 } catch (MissingMethodException e) {
     assert e
 }
 def indexedGroup = new IndexedGroup(name: 'Grails')
 indexedGroup.members[0] = 'mrhaki'
 indexedGroup.setMembers 1, 'Hubert'
 assert 2 == indexedGroup.members.size()
 assert 'mrhaki' == indexedGroup.getMembers(0)
 assert 'Hubert' == indexedGroup.members[1]