Em Delphi(TM) havia alguns truques via RTTI(Run Time Type Information) que sem ser programadores paranormais com truques do tipo “limpe 50 TEdits com 3 linhas de código” animavamos todo o time de desenvolvimento. Com Java, RTTI tem um nome mais bonito Reflection.
O saudosismo deste post, deve-se a lembrança de práticas similares, no caso, eu precisava criar uma classe BeanToProperties e PropertiesToBean, para que fosse possível ler um properties e todas sua chaves fossem passadas para atributos de um bean, claro com atributos com memso nome (já que não há um decoador “de para”), e vice-versa. Acho que até pode existir isso num Apache Commons da vida, mas como eu estou passando grande parte dos meus dias em aeroportos e apertado nos assentos da Tam e Grande Onibus Lotado, onde há pouca internet disponível, então resolvi criar um recurso destes para finalizar uma atividade no projeto, veja então o resultado.
Primeiro, eu preciso saber se o atributo da Classe em questão é equivalente a uma chave do Properties que tenho carregado, veja então:
public static java.util.List getFieldsFromClass(
Properties props) {
java.lang.reflect.Field[] methods = new ClientProperties()
.getClass().getDeclaredFields();
ArrayList< ?> a = Collections.list(props.propertyNames());
java.util.ArrayList fieldList = new java.util.ArrayList();
for (java.lang.reflect.Field m : methods) {
if (a.contains(m.getName())) {
fieldList.add(m);
}
}
return fieldList;
}
Em seguida, preciso obter os dados das chaves e atribuir aos atributos usando os métodos gets, para isso, veja o método:
ClientProperties bean = new ClientProperties();
List fields = getFieldsFromClass(props);
for (Field f : fields) {
try {
String methodName = “set”
+ f.getName().substring(0, 1).toUpperCase()
+ f.getName().substring(1, f.getName().length());
Class[] params = new Class[] { String.class };
Method method = bean.getClass().getDeclaredMethod(methodName,
params);
method.invoke(bean, props.getProperty(f.getName()));
Com isso, o objeto “bean” irá executar para a propriedade core o mesmo que: bean.setCore(prop.getValue(”core”)); , só que se eu tiver 58 propriedades, este método me economiza um super tempo!
Espero que esta dica ajude, ela está aqui com certeza para me ajudar, caso amanha eu esqueça como já fiz isto, mais ou menos como quase tudo que há em nível de códigos nesse blog. Até a próxima.
[]
Edgar