Construção de Frameworks com Annotation e Reflection API em Java

download Construção de Frameworks com Annotation e Reflection API em Java

If you can't read please download the document

description

Esse minicurso foi apresentado no CET 2012 (www.cetufg.com.br). Ele apresenta como é feita a construção de um framework em Java, focando em Annotation como forma de configuração e Reflection API como forma de interpretar essa configuração. Os exemplos estão disponíveis em um projeto do Eclipse presente em: https://dl.dropbox.com/u/22997932/Minicurso.zip

Transcript of Construção de Frameworks com Annotation e Reflection API em Java

  • 1. Frameworks com Annotations e Reflection APIFernando CamargoDesenvolvedor Java EE e AndroidGraduando do 4 ano de Engenharia De Computao pela UFGEstuda e programa em Java desde 2009Em estudo para a OCJP 6

2. AgendaFrameworksAnnotationsReflectionFramework Final: Serializador e desserializadorXML-Objeto 3. Discusso sobre Frameworks 4. Discusso sobre Frameworks Hora de discutir!O que significa Framework? 5. Discusso sobre FrameworksUm framework, em desenvolvimento desoftware, uma abstrao que une cdigoscomuns entre vrios projetos de softwareprovendo uma funcionalidade genrica. 6. ExemploUma empresa de tecnologia, ao longo dos anos, foi desenvolvendo diversos sistemas para uso interno. Aps anos, uma regra de negcio foi alterada para melhor posicionar a empresa no mercado. Essa regra era implementada em todos os sistemas internos. E agora, como alter-la? 7. Framework e bibliotecaBiblioteca:Classes independentes usadas para determinadas funes (utilitrios) que so chamadas pelo cliente.Framework:Interconexo de classes que trabalham emconjunto para um fim comum s vriasaplicaes. O cliente insere cdigo especficoque ser chamado pelo cdigo geral doFramework. 8. ExemploDepois de um projeto de 3 anos, um grupo de programadores pega um projeto parecido e com grande nvel de complexidade. Vendo que poderiam reutilizar cdigo, eles copiam e colam o que pode ser reusado nesse novo projeto. Depois de 1 ano, eles descobrem que h uma falha grave de segurana no primeiro projeto, em cdigo comum ao 2. Como resolver o problema dos dois? Se esse cdigo reusvel estivesse em um nico lugar, seria mais fcil ou difcil? 9. FrameworkAcima de tudo, reusvelAtender as novas classes criadas, fazendo coisas especficas.Como ser reusvel e ser especfico ao mesmo tempo? No possuimos nada sobre as classes que sero criadas no futuro! 10. Prever o Futuro (?)Existem algumas formas de prevermos o futuro, nesse caso.InterfacesClasses abstratasMetadados 11. Interfaces e Classes AbstratasAtravs delas, podemos prever o que poder ser feito em tempo de compilao, mas obrigamos o cliente a assinar contratos (interfaces), implementando mtodos que podem no ser de seu interesse ou tiramos sua oportunidade de usar herana, obrigando-o a fazer sua classe herdar de uma classe abstrata. 12. Interfaces e Classes AbstratasInterfaces e classes abstratas podem compor umframework?Sim.Ento por que no usar apenas interfaces e classes abstratas?Plug and play 13. AlternativaAlternativa para deixar as classes de negciossimples e independentes:Metadados: XML e AnnotationsInterpretao e execuo: Reflection API 14. MetadadosDados que descrevem dadosMostra ao framework o que voc desejaDeixa as classes limpas para implementar apenas o necessrioDesvantagens: no geram erros de compilao, j que as verificaes s podero ser feitas em tempo de execuo. 15. Metadados (XML)Pode ser criado para configurar um framework e lhe mostrar a direo correta.Vantagem: pode ser modificado sem necessitar recompilao.Desvantagem: aplicaes grandes e complexas podem gerar arquivos XML gigantes e difceis de serem lidos. 16. Metadados (Annotations)So anotaes que descrevem classes, mtodos, propriedades e parmetros.So anotadas em sua prpria classe, ao invs de acumuladas em um XML.Facilita a leitura e o ententimento de outros programadoresDesvantagens: necessita recompilao do cdigo, quando alterado. 17. ReflectionReflection: a habilidade de um programa observar e modificar sua prpria estrutura em tempo de execuo.Java prov essa habilidade atravs da ReflectionAPI 18. Interpretando os metadadosCom Reflection, podemos interpretar os metadados que descrevem uma classe e acessar, modificar e chamar propriedades, mtodos, e toda a estrutura da classe.O cdigo interpreta os metadados e as classes descritas em tempo de execuo. 19. Frameworks famososSpring (XML, Annotations e Reflection)EJB 3 (XML, Annotations e Reflection)JSF (XML, Annotations e Reflection)Hibernate (XML, Annotations e Reflections)JUnit (Classes Abstratas Annotations) 20. Annotations 21. Introduo s AnnotationsCriadas na verso 1.5 do JavaTm papel de metadadoPodem descrever:ClasseConstrutorMtodoParmetroVarivel local e de instnciaAnnotation 22. Annotations pr-existentes@Override@SuppressWarnings@Deprecated@Rentention@Target@Documented@Inherited 23. @OverrideInforma o compilador que determinado mtodoest sendo sobrescrito.Caso anote um mtodo que no herdado, ocorrer um erro de compilao. Exemplo 1 24. @SuppressWarningsInforma o compilador que determinado(s)warning(s) so de seu conhecimento e nodevem ser emitidos pelo compilador. Exemplo 2 25. @DeprecatedAvisa aos possveis usurios da API e o compilador que aquele mtodo no deveria ser mais usado, pois h alternativas melhores. Exemplo 3 26. As demais@Rentention, @Target, @Documented e @Inherited so meta-annotations. Usadas para descrever outras annotations e ser mostrado em breve. 27. Annotations criadas por Frameworks famosos@Entity: Descreve uma classe como uma unidade a ser persistida.@ManagedBean: Descreve que uma classe deve ser gerenciada pela JSF.@Named: Nomeia uma classe para ser usada em CDI.@Service: Descreve uma classe como um servio.@Inject: Descreve que determinada instncia ou parmetro deve ser injetada. 28. Criando nossas AnnotationsUma Annotation declarada da seguinte forma:public @interface Annotation{String parametro();} 29. Classificaes de AnnotationsPodemos separar as Annotations em vrias classificaes:Quanto a quantidade de parmetrosQuanto ao seu alvoQuanto a sua retenoDocumentadas ou no 30. Annotation de nenhum parmetro Exemplo 4 31. Annotation de nico parmetro Exemplo 5 32. Annotation de mltiplos parmetrosExemplo 6 33. Tipos de ParmetrosTipos primitivosStringClassEnumArray dos tipos acima Exemplo 7 34. Alvos das AnnotationsAs annotations, quando criadas, podem definir em quais lugares podem ser aplicadas.A meta-annotation @Target indica quais elementos de cdigo para os quais uma annotation aplicavel.Esses alvos so: Tipo, Propriedade, Mtodo, Parmetro, Construtor, Varivel Local e Annotation.Exemplo 8 35. Reteno das AnnotationsAs annotations tambm podem definer at que ponto elas devem ser consideradas.Atravs da meta-annotation @Retention, podemos definir que uma annotation deva ser considerada. Temos trs opes:Apenas no cdigo fonte.Durante a compilaoDurante a execuo (usada no Reflection)Exemplo 9 36. Documentao da AnnotationAs annotations podem ou no aparecer no JavaDoc do projeto. Para habilitar isso, apenas anote a Annotation com:@DocumentedLembre-se: Um framework no documentado intil! 37. A meta-annotation @InheritedIndica que a annotation criada no momento serherdada em todas as subclasses.Ou seja, quando buscarmos se uma determinada classe tem essa annotation, a encontraremos caso uma superclasse a tenha. Exemplo 10 38. ReflectionExaminar o programa por sua estrutura e dadosTomar decises usando os resultados do exameMudar o comportamento, estrutura ou dados do programa baseado nas decisesO trabalho de um programador? Ou pode ser feito pelo prprio programa? 39. ReflectionVamos ver agora um exemplo simples desses trs passo.Exemplo 11 40. Reflection - IntrospectionReflection a habilidade de um programa fazer os 3 itens ditos anteriormente.Para fazer um auto-exame, necessrio que o programa tenha uma representao de si mesmo, o que chamamos metadados. Na orientao a objetos, metadata organizada em objetos, o que nos d metaobjetos. A auto- examinao de um programa em tempo de execuo chamada introspection (introspeco). 41. Reflection Mudana decomportamentoExistem trs tcnicas para fazer a mudana de comportamento em um programa:Modificao direta do metaobjetoOperaes usando os metadadosIntercesso (interceder em vrias fases deexecuo do programa)Java nos traz a Reflection API vrias operaesusando os metadados e algumas capacidadesde intercesso, mas no nos permite modificaro metaobjeto. 42. DiscussoImagine a situao em que um projeto tenhavrias classes de diferentes bibliotecas quecompoem a interface grfica. Algumas dessasbibliotecas no podem ser modificadas.Todaselas possuem um mtodo setColor, que recebeum objeto do tipo Color, mas elas noimplementam nenhuma interface em comumnem extendem uma superclasse.Queremoschamar esse mtodo para qualquer dessescomponentes, o que faremos? 43. Melhor soluo para a DiscussoA melhor soluo para esse problema um mtodo que recebe um Object e faz uso de Reflection para encontrar um mtodo setColor que receba um parmetro Color e o chamar. Exemplo 12 44. ClassO objeto do tipo Class a base da introspeco. Ele o metaobjeto que representa determinada classe.Atravs dele acessamos:CamposMtodosrvore hierrquica (superclasses e subclasses)ConstrutoresAnnotations 45. Obtendo um objeto ClassTemos trs formas de obter o objeto Class.getClass(): Herdade de Object. Nos retorna, em tempo de execuo, o objeto Class de uma determinada instncia..class: chamado usando o nome da classeseguido por .class. Devemos decidir em tempode compilao qual classe queremos.Class.forName(className): Retorna o objeto Class a partir do nome da classe. 46. Obtendo um mtodoUm mtodo tem por assinatura seu nome e seus parmetros. Podemos obt-los da seguinte forma:getMethod: retorna um mtodo pblico com dada assinatura, independente se herdado ou declarado na classe.getDeclaredMethod: retorna um mtodo declarado na classe, independente de sua visibilidade, a partir de sua assinatura. 47. Assinatura de um mtodoAmbos getMethod e getDeclaredMethod recebem os mesmos parmetros:getMethod(String nomeDoMetodo,Class... parametros);Os parmetros so um var-args de Class que representam esses parmetros. 48. Listando mtodosPodemos listar todos os mtodos de uma classe atravs dos mtodos:getMethods(): retorna um array de Method de visibilidade pblica, declarados ou herdados.getDeclaredMethods(): retorna um array de Method declarados na classe, independente da visibilidade. 49. DiscussoVimos que passamos um var-args de Class paraencontrarmos um mtodo.Como encontrariamos um mtodo que recebe como parmetro uma varivel primitiva, uma interface e/ou um array? 50. Representando tipos atravs de ClassEm Java, devido ao problema da discusso, todos os tipos so representados com um objeto Class. Isso inclui as Interfaces, os tipos primitivos e os arrays.Esses objetos Class no podem fazer todas as coisas que outras podem. Voc no pode criar uma nova instncia de um primitivo ou uma interface.Essas representaes so necessria para fazer a introspeco. 51. Representando tipos atravs de ClassAps obtermos o objeto Class, podemos testar se ele representa um array, um primitivo ou uma interface atravs dos mtodos:isArray()isPrimitive()isInterface()Veremos agora como Java representa cada um desses tipos usando objetos Class. 52. Representando tipos primitivosEmbora tipos primitivos no sejam objetos, Java usa objetos Class para representar todos os 8 tipos primitivos. Os primitivos so representados usando o literal class aps o nome do primitivo. Assim, representamos:int.class, float.class, double.class, short.class,long.class, char.class, boolean.class, byte.classTambm precisamos de uma representao para void, que representado por void.class. 53. Representando interfacesJava tambm introduz um objeto Class pararepresentar cada Interface declarada. Essesobjetos podem ser usados para indicarparmetros do tipo de uma interface.Obtemos o objeto Class que representa uma interface atravs do literal class. Um exemplo seria a interface Collection, sendo representada por Collection.class. 54. Representando arraysArrays, em Java, so objetos, mas suas classes so criadas pela JVM em tempo de execuo. Seus objetos Class tambm so obtidos atravs do literal class. Por exemplo, um array de uma dimenso de Object representado por Object[].class.Podemos descobrir qual o componente de um array atravs de getComponentType(), que retornaria um objeto Class de Object para o exemplo acima. 55. Exemplo: fazendo introspeco na classe VectorVamos fazer introspeco para pegar os seguintes mtodos da classe Vector:addAll(Collection c)copyInto(Object[] anArray)get(int index) Exemplo 13 56. O objeto MethodRepresenta um mtodo de determinada classe que tenha determinada assinatura (nome + parmetros).Prov imformaes sobre um mtodo, como seu nome, os tipos de seus parmetros, o tipo de seu retorno e excees. Tambm d a habilidade de invoc-lo em uma instncia da classe que o declara. 57. Invocao dinmica (1)Habilita um programa a chamar um mtodo de um objeto em tempo de execuo sem especific-lo em tempo de compilao.Object invoke(Object target, Object... parameters);Target o objeto que ter seu mtodo chamada. Parmetros (var-args) so os parmetros que o mtodo invocado espera. O mtodo invoke retorna um Object, o retorno do mtodo invocado. 58. Invocao dinmica (2)O primeiro parmetro, target, ser desconsiderado em um mtodo static, ento legal passar null. Tambm legal passar null ou um nada em um mtodo sem parmetros.Os parmetros so passados como Object, o que significa que so passados os Wrappers ao invs dos primitivos (Integer int). O mesmo vale para o retorno, que retorna um Object.Um mtodo de retorno void ter um retorno null no mtodo invoke. 59. Invocao dinmica (3)IllegalArgumentoException ser lanada quando o target no suportar o mtodo ou quando os parmetros estiverem incorretos.Qualquer exceo lanada dentro do mtodo invocado lanar uma InvocationTargetException. Exemplo 14 60. DiscussoTemos o mtodo getMethod para acessar mtodos pblicos (declarados e herdados) e temos getDeclaredMethod para acessar mtodos declarados de qualquer visibilidade.Como podemos acessar um mtodo protected de uma superclasse? Exemplo 15 61. rvore de hierarquiaPodemos ter acesso informaes da rvore de hierarquia de uma classe atravs dos seguintes mtodos:Class[] getInterfaces()Class getSuperclass()boolean isAssignableFrom(Class cls): Verificada se cls uma subclasse.boolean isInstance(Object obj): Verso de Reflection de instanteof. 62. O objeto FieldRepresenta um campo (varivel de instncia) de determinada classe. identificado pela classe o qual pertence e pelo nome.Atravs dele, obtemos informaes sobre o tipo, o nome, os modificador e at o valor do campo de uma instncia. Podemos us-lo para pegar e modificar o valor de um campo. 63. Acesso um objeto Field (1)Assim como fizemos com o objeto Method, ser forma com o objeto Field.getField(String nome): retorna um campo pblico que tenha esse nome.getDeclaredField(String nome): retorna um campo de qualquer visibilidade declarado na classe.getFields(): retorna todos os campos pblicos.getDeclaredFields():retorna todos os campos declarados. 64. Acesso a um objeto Field (2)Para acessar todos os campos declarados e herdados independente de visibilidade, devemos percorrer a rvore hierarquica em busca dos campos declarados nela.Quando uma busca por um campo no o encontra, lanada a NoSuchFieldException. Exemplo 16 65. ModificadoresClass, Method e Field possuem modificadores. Entre seus possveis modificadores, podemos citar: public, private, protected, static, final, abstract, etc.Para termos acesso a esses modificadores, usamos getModifiers(), que retorna um nmero inteiro (vetor de bits). Para usarmos esse vetor de bits, usamos a classe Modifier para interpret-lo. Exemplo 17 66. Valor de um Field (1)Podemos acessar o valor do campo de um objeto e tambm modific-lo atravs de Reflection.get(Object target): Retorna o valor do campo na instncia target.set(Object target, Object value): Ajusta o campo,na instncia target, para o novo valor value.Em ambos os casos, primitivos so usados atravs de seus Wrappers (int Integer) 67. Valor de um Field (2)Tambm h um mtodo especfico para cada primitivo/wrapper. Porm, s devem ser usados caso tenha certeza do tipo do campo, ou lanaram IllegalArgumentException.getBoolean / setBooleangetInt / setIntExemplo 18 68. Acessibilidade (1)Como visto no exemplo anterior, ao tentar acessar campos no pblicos, lanada uma IllegalAccessException. O mesmo acontece com mtodos.Isso acontece porque, em tempo de execuo,h uma checagem de acesso na invocao demtodos e acesso do valor de campos. 69. Acessibilidade (2)Podemos contornar isso desabilitando a verificao de acessibilidade em tempo de execuo. Fazemos isso usando:setAccessible(boolean param): Se true, torna omtodo/campo acessvel via Reflection. Sefalse, torna inacessvel.boolean isAccessible(): Verifica a situao atual do mtodo/campo. Exemplo 19 70. Desvantagens na acessibilidadeQuebra o encapsulamento dos objetos.No uma operao leve.Pode ser desabilitada em algumas JVMs.Devemos usar essa operao apenas em caso estritamente necessrios. Ao contrrio, devemos priorizar por chamar apenas mtodos pblicos e usar os getters e setters de determinado campo. 71. Campo do tipo Array (1)Array um tipo de objeto diferente que merece um tratamento especial. Para isso, o Java prov a classe Array como um facilitador nas operaes com Arrays em Reflection. Ele possui os seguintes mtodos:getLenght(Object array): Retorna o tamanho do array.get(Object array, int i): Retorna o i-simo elemento do array.set(Object array, int i, Object valor): Ajusta ovalor do i-simo elemento do array. 72. Campo do tipo Array (2)newInstance(Class tipo, int length): Cria um novo array do tipo especificado com o tamanho especificado.Tambm temos outros mtodos que devem ser consultados na API.Exemplo 20 73. Reflection e Generics (1)Generics so usados em duas situaes:Declarar uma classe/interface como parametrizada.Usar uma classe parametrizada.Usamos constantemente classes parametrizadas desde o Java 5. Um grande uso est nas collections, como List, Vector, Map, etc. Essa parametrizao nos permite criar uma lista de Strings ao invs de uma lista de Objects. 74. Reflection e Generics (2)Em tempo de execuo, essa parametrizao apagada da classe, j que podem haver vrias instncias com parmetros diferentes. Mas essa informao fica disponvel nos Methods, Fields, nas interfaces e superclasses parametrizadas atravs de Reflection.Assim como importante saber o tipo dos componentes de um Array, tambm importante saber o tipo dos objetos guardados em uma Collection nas nossas introspeces. 75. Reflection e Generics (3) importante saber que Class implementa a interface Type, pois trabalharemos com essa interface e tambm com ParameterizedType.Atravs de um Method ou um Field, teremos acesso a um ParameterizedType (que pode possuir mais de um tipo parametrizado). Atravs disso, acessamos a lista de Types, que podemos dar um cast para Class e continuar nossa introspeco. 76. GenericReturnTypeUm mtodo pode retornar uma classe/interface parametrizada. importante sabermos qual o tipo dessa parametrizao.Usamos o mtodo:Type getGenericReturnType()Esse mtodo retorna um Type. Ento podemos testar usando instanceof se esse tipo se trata de um ParameterizedType. Caso seja, acessamos os tipos como foi descrito.Exemplo 21 77. Reflection e Generics (4) importante saber que todos os mtodos getGeneric[...]() retorna um Type, que pode ser um ParameterizedType.Esses mtodos esto presentes em Method:getGenericReturnType(): Usado para seu retorno.getGenericParameterTypes(): Retorna um array de Type dos parmetros.getGenericExceptionTypes(): Funciona da mesma forma para Exceptions. 78. Reflection e Generics (5)Em Field:getGenericType(): Usado para verificar o tipo do campo.Em Class:getGenericInterfaces(): Retorna os tipos das interfaces implementadas pela classe.getGenericSuperclass(): Retorna o tipo da superclasse. 79. Constructor (1)Uma classe possui de 1 a N construtores. atravs deles que um objeto construdo.Acessando um metaobjeto Constructor, podemos construir um objeto de uma determinada classe.Podemos obter um Constructor da seguinte forma:Constructor getConstructor(Class... tiposParametros): Retorna um Constructor para os tipos de parmetro especificados. 80. Constructor (2)Constructor[] getConstructors(): Retorna todos os construtores da classe.Quando um construtor no encontrado para determinados tipos de parmetros, lanada uma NoSuchMethodException, assim como acontece quando um mtodo no encontrado.Tambm acessamos os tipos de seus parmetros atravs de:getParameterTypes(): Retorna as classes que representam os tipos dos parmetros. 81. Constructor (3)Possuindo uma instncia do tipo Constructor, podemos criar uma nova instncia da classe a qual ele pertence.Criamos uma nova instncia da classe da seguinte forma:Object newInstance(Object... parametros): Cria uma nova instncia da classe usando os parmetros passados.Exemplo 22 82. Constructor (4)As excees lanadas e a acessibilidade do construtor se assemelha ao de um mtodo. Tambm vlido torn-lo acessvel atravs de setAccessible(boolean).Podemos parametriz-lo com a classe que ser construza, caso saibamos qual . Assim, ao invs de retornar um Object, ele retornar a classe parametrizada. 83. JavaBeans e Reflection (1)JavaBeans so POJOS (Plain Old Java Objects)que serem um padro de encapsulamento doscampos.Entre vrios outras coisas especificadas, temos que os campos devem ser privados com mtodos de acesso (get e set).Como vimos, devemos evitar mudar a acessibilidade dos campos com Reflection, por ser um processo pesado e romper seu encapsulamento. 84. JavaBeans e Reflection (2)Padro de mtodos de acesso para campos privados:Propriedade: T xyzpublic T getXyz()public void setXyz(T novoValor)Propriedade: boolean xyzpublic boolean isXyz()public void setXyz(boolean novoValor) 85. JavaBeans e Reflection (3)Devemos, sempre que possvel, recorrer aos mtodos de acesso para acessar campos privados. Temos duas alternativas para isso:Tratar o nome do campo para se chegar o nomecorreto do mtodo de acesso.Utilizar as classes do pacote java.beans.Vamos abordar a primeira alternativa por ser mais simples. O pacote java.beans poder ser estudado depois.Exemplo 23 86. Annotations e Reflection (1)As Annotations especificadas a perdurarem at o tempo de execuo podero ser acessadas via Reflection.Assim como classes, interfaces e primitivos, as Annotations tambm tem uma representao atravs de uma Class.Uma instncia com os valores definidos na anotao representado pelo tipo Annotation. Podemos usar sua representao de Class para alcanar sua representao Annotation. 87. Annotations e Reflection (2)Classes, interfaces, mtodos, parmetros, construtores e campos podem ser anotados. Dessa forma, todos possuem os mtodos:Annotation getAnnotation(Class cls): Retorna uma instncia do tipo da Annotation. Podemos dar um downcast para nossa annotation e us- la para acessar os valores definidos onde foi anotada. 88. Annotations e Reflection (3)Annotation[] getAnnotations(): Retorna um array com todas as annotations definidas e herdadas no elemento.Annotation[] getDeclaredAnnotations(): Retorna um array com apenas as annotations definidas no elemento. As herdadas (@Inherited) so ignoradas. Exemplo 24 89. Por onde seguirAntes de apresentar o Framework final, feito com o contedo apresentado, segue uma lista do que falta estudar:Pacote java.beans.Proxy (interceptao de mtodos)Questes de performanceClassloaderGerao de cdigo 90. Framework Final (1)A proposta de framework a ser implementada a seguinte:Framework reponsvel por gerenciar asincronizao de dados entre diferentesplataformas. Essa sincronizao precisar detrocas de mensagens, que iro conter umaserializao dos objetos na forma de XML.As diferentes plataformas que receberem as mensagens tero um deserializador que transformar o XML de volta para um objeto. 91. Framework Final (2)Usando Annotations e Reflection, nos limitaremos a implementar apenas o serializador e o deserializador de Objeto-XML.As classes dos objetos sero anotadas com algumas configuraes para a serializao.Devemos criar esses Annotations e os mtodos de serializao e deserializao. 92. Especificando os metadadosOs metadados sero compostos das seguintes annotations:@XML: Marca que uma classe pode ser serializada e deserializada em XML. Tambm especifica como ser a serializao dos campos ou de um campo campo especfico@Transient: Marca que um campo no deve ser serializado@ServerId: Marca um campo como sendo o identificador do objeto no servidor 93. Eagle SyncA proposta do Framework est implementada com cdigo fonte livre sobre licena Apache 2.0, o que d o direito de qualquer pessoa usar o cdigo da forma que quiser.Para ver ou contribuir com o projeto, acesse:code.google.com/p/eagle-sync/ 94. RefernciasFORMAN, I. R.; FORMAN, N. Java Reflection in Action. Manning, 2006. 95. ContatosEmail: [email protected]: @fernandosstFacebook: www.facebook.com/fernandosstLinkedIn: br.linkedin.com/pub/fernando-camargo/26/21/286Blog: fernandocamargoti.blogspot.com