[quote=AbelBueno]
Mas não acho que com proxy dinâmico você consiga alterar o tipo de retorno de um método (eu acho).
Daí, imagino, que o seu getUserName e getBirthdate teria que continuar retornando seus tipos originais.
Se você fosse adicionar meta informação ao método, teria que obter de outra forma.
Pelo menos é isso que eu acho.[/quote]
Acho que não expliquei bem o que eu estava querendo mostrar.
A manipulação de bytecode não é para mudar o tipo de retorno, nem para fazer operações comuns de Reflection como descobrir atributos de uma classe.
Ela serve para criar um proxy dinâmico do objeto User, sobrescrevendo os métodos get. (pois a API de proxy padrão do Java só permite implementar interfaces, não sobrescrever classes!)
Vou colocar mais em detalhe o que aconteceria:
- Ao executar a chamada .field([color=red]userAttributes.getUsername()[/color], DBTypes.STRING) , o método userAttributes.getUsername() será avaliado antes do .field(), ok?
- A implementação do proxy , ao receber a chamada, vai calcular o nome do atributo (usando o nome do próprio método invocado) e guardar em algum lugar (pensando em um exemplo bem porco, seria uma variável static, mas claro que não estou sugerindo fazer assim… é só para ficar mais simples de entender, imagine que não existem situações de concorrência).
- Em seguida o .field() é invocado, e pega o valor nessa variável temporária. O valor do parâmetro em si é ignorado.
- E assim tudo se encaixa, a cada chamada encadeada de .field() e userAttributes.getXXX() os nomes dos campos vão sendo atribuídos.
- O tipo retornado por getUsername() não importa, porque ele usou outra maneira para passar a informação que interessas; O método field() pode receber Object nesse parâmetro apenas para permitir que se passe qualquer coisa para ele.
Isso é o que eu inferi vendo o funcionamento do VRaptor (e suas dependências, muitas são libs para manipular bytecode e criar proxy de classes), se tiver algum desenvolvedor do framework por aqui pode corrigir se eu disser alguma besteira.
Mas o que eu quero é tirar TODOS esses atributos identificados por nome, e usar coisas mais amigáveis para refatoração. Inclusive porque refatoração é o grande ponto forte da configuração programática.
É disso mesmo que eu estava falando, mas de uma forma mais suave: no Hibernate você trabalha com objetos proxy o tempo todo, já nesse caso eles estariam em ação apenas durante a configuração.
Ora, vamos lá, você não quer ser como eles, quer? 8)
