Bean Inspector
By E.Hooijmeijer
1 Inleiding
De architect van dit project is het serieus in zijn bol geslagen. Hij is naar een Ruby
seminair geweest en sinds dien moet alles dynamisch en los gekoppeld. Het gaat zelfs zo
ver dat hij alle types en type-checks achter zich wil laten en alles at runtime wil
bepalen. Zijn motto : 'alles is een object, en dat is genoeg !'. Hah!.
Voor jou nu de taak om er achter te komen wat de eigenschappen zijn van de objecten
die de architect aan je geeft. Zodat je ze 'at runtime' kunt aanroepen.. Gelukkig weet
je dat alle objecten volgens de Java Bean specificatie zijn geschreven.
2 Opdracht
Implementeer de BeanInspector welke de publieke properties van een gegeven object moet
bepalen. Iedere property moet worden opgeslagen in een BeanPropery. Een property heeft
een naam een type (de class) en een boolean die aangeeft of hij readonly is.
Een methode die begint met 'get' is mogelijkerwijs een property. Dit natuurlijk alleen
als er ook nog wat achter staat (getName) en er een return type is. Houd in de gaten dat
bij een property naam de eerste letter altijd een kleine is.
Voor een 'set' methode, deze kan alleen een property zijn als er ook een 'get' met
dezelfde naam erbij hoort en van het zelfde type is.
De getter voor een boolean property mag ook beginnen met 'is'.
3 Voorbeeld
Gegeven de volgende klasse
public class Gadget extends Object {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name=name; }
}
Deze bevat 1 overduidelijke property, de 'name' van het gadget welke van het type
java.lang.String is en niet readonly is. De andere property is de 'class' welke
onderdeel uitmaakt van Object. Deze is readonly en van het type Class.
4 Tips
- Het schijnt dat Sun al eens wat hulp classjes heeft gemaakt. Maar waar zouden ze zitten ?
- Bean bean java.beans vertel eens wat je hebt geziens.
Test case 1 : No Bean
Examine the given object and determine its java bean properties.
The expected results are :
No results - empty list.
Test case 2 : Get,Set Go!
Examine the given object and determine its java bean properties.
The expected results are :
Property name='name' readonly='false' type='java.lang.String'
Property name='class' readonly='true' type='java.lang.Class'
Test case 3 : Is,Set Go!
Examine the given object and determine its java bean properties.
The expected results are :
Property name='enabled' readonly='false' type='boolean'
Property name='class' readonly='true' type='java.lang.Class'
Test case 4 : Give me an argument
Examine the given object and determine its java bean properties.
The expected results are :
Property name='name' readonly='true' type='java.lang.String'
Property name='class' readonly='true' type='java.lang.Class'
Test case 5 : No private parts
Examine the given object and determine its java bean properties.
The expected results are :
Property name='class' readonly='true' type='java.lang.Class'
Test case 6 : Void is a nono
Examine the given object and determine its java bean properties.
The expected results are :
Property name='class' readonly='true' type='java.lang.Class'
Test case 7 : Lotsa Properties
Examine the given object and determine its java bean properties.
The expected results are :
Property name='roomOne' readonly='false' type='java.lang.String'
Property name='roomTwo' readonly='false' type='boolean'
Property name='roomSix' readonly='false' type='int'
Property name='roomThree' readonly='false' type='java.lang.Boolean'
Property name='roomSeven' readonly='false' type='java.lang.Integer'
Property name='roomFour' readonly='false' type='double'
Property name='roomFive' readonly='false' type='java.lang.Double'
Property name='class' readonly='true' type='java.lang.Class'
Test case 8 : Just get it
Examine the given object and determine its java bean properties.
The expected results are :
Property name='class' readonly='true' type='java.lang.Class'
Test case 9 : Type mixup..
Examine the given object and determine its java bean properties.
The expected results are :
Property name='banana' readonly='true' type='int'
Property name='class' readonly='true' type='java.lang.Class'