Semana passada foi lançada a versão d Mirror 1.6. Para quem não conhece, o Mirror é uma DSL para lidar com Reflection. Essa versão trás algumas melhorias, como suporte a proxys. Mais informações em http://projetos.vidageek.net/mirror-pt/projeto/release-notes/
O último projeto é o Scraper, que é uma forma mais simples de se extrair dados de documentos html (nada de XPath, DOM Traversal, etc). Mais informações em http://projetos.vidageek.net/scraper/scraper
Todo feedback (até mesmo um “Isso não serve para nada” ou um “Não reinvente a roda”) é muito bem vindo
Semana passada foi lançada a versão d Mirror 1.6. Para quem não conhece, o Mirror é uma DSL para lidar com Reflection. Essa versão trás algumas melhorias, como suporte a proxys. Mais informações em http://projetos.vidageek.net/mirror-pt/projeto/release-notes/
O último projeto é o Scraper, que é uma forma mais simples de se extrair dados de documentos html (nada de XPath, DOM Traversal, etc). Mais informações em http://projetos.vidageek.net/scraper/scraper
Todo feedback (até mesmo um “Isso não serve para nada” ou um “Não reinvente a roda”) é muito bem vindo :)
Parabens pelos projetos
Z
zoren
Opa, Parabéns
Já brinquei com o Mirror algumas vezes, achei muito bom.
F
Felagund
zoren:
Opa, Parabéns
Já brinquei com o Mirror algumas vezes, achei muito bom.
Eu uso o mirror em produção
N
nofan
Realmente fantasticos os projetos e ótimas atualizações, parabens!
Caramba, não vi mesmo, o link estava no fim do menu.
Z
zoren
Tem algum segredo para o Proxy funcionar?
É estilo o Proxy do Java?
Tentei aqui mas deu erro
Caused by: java.lang.ClassFormatError: Duplicate method name&signature in class file App$UmaClasse$$EnhancerByCGLIB$$4d7bcdbf
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
Fiquei curioso para ver isso funcionando.
V
von.juliano
Segue um exemplo:
Objectproxy=newMirror().proxify(OneClassFixture.class,OneInterfaceFixture.class,OtherInterfaceFixture.class).interceptingWith(newMethodInterceptor(){publicbooleanaccepts(finalMethodmethod){returntrue;}publicObjectintercepts(finalObjecttarget,finalMethodmethod,finalObject...parameters){return"foo";}});System.out.println(((OneInterfaceFixture)proxy).interfaceMethod());System.out.println(((OtherInterfaceFixture)proxy).otherInterfaceMethod());System.out.println(((OneClassFixture)proxy).classMethod());// OneClassFixture.classMethod() por si só retorna "test"
Posta seu código, incluindo as classes que você está tentando proxiar.
Z
zoren
Eu tentei com aquele seu código.
publicclassMain{publicstaticvoidmain(String[]args){Objectproxy=newMirror().proxify(OneClassFixture.class,OneInterfaceFixture.class,OtherInterfaceFixture.class).interceptingWith(newMethodInterceptor(){publicbooleanaccepts(finalMethodmethod){returntrue;}publicObjectintercepts(finalObjecttarget,finalMethodmethod,finalObject...parameters){return"foo";}});System.out.println(((OneInterfaceFixture)proxy).interfaceMethod());System.out.println(((OtherInterfaceFixture)proxy).otherInterfaceMethod());System.out.println(((OneClassFixture)proxy).classMethod());// OneClassFixture.classMethod() por si só retorna "test"}}classOneClassFixtureimplementsOneInterfaceFixture,OtherInterfaceFixture{publicStringclassMethod(){return"test";}@OverridepublicStringinterfaceMethod(){returnclassMethod();}@OverridepublicStringotherInterfaceMethod(){returnclassMethod();}}interfaceOneInterfaceFixture{publicStringinterfaceMethod();}interfaceOtherInterfaceFixture{publicStringotherInterfaceMethod();}
V
von.juliano
Isso é um erro da sua implementação. Se a classe implementa a interface, e você tentar proxiar a classe e a interface, vai ocorrer uma exceção indicando que há métodos duplicados, da mesma forma como você não pode ter dois métodos com a mesma assinatura em uma classe.
O proxy gerado vai ter todos os métodos do objeto proxiado + todos os das demais interfaces, então se a sua OneClassFixture implementar as interfaces, os métodos já existirão no objeto, causando essa exceção.
Blz? Flw! :thumbup:
Z
zoren
Cara, não entendi ainda.
Estou com um problema nas minhas ideias.
Poderia colocar aquele seu código com todas as suas classes?
Eu fiz um teste sem implementar as interfaces na classe e deu o mesmo erro.
V
von.juliano
A idéia do proxy é que ele é um objeto que finge ser outro (via polimorfismo). Em Java, tem duas formas de obter polimorfismo: Implementar uma interface ou extender uma Classe. O proxy tem que ser polimórfico com relação a tudo que for passado no proxyfy, e como só da para herdar de uma classe (mas você pode implementar inúmeras interfaces), somente uma classe (concreta ou abstrata) pode ser passada, pois é o máximo que se consegue fazer um proxy.
Vou proxiar essa classe e a interface, quero que ambos os métodos retornem "proxiado!":
Objectproxy=newMirror().proxify(UmaClasse.class,UmaInterface.class).interceptingWith(newMethodInterceptor(){
publicbooleanaccepts(finalMethodmethod){
returntrue; // isso indica que quaquer método será proxiado, no caso de métodos com o mesmo retorno e numero de parâmetros, vai funcionar sem problemas}
publicObjectintercepts(finalObjecttarget,finalMethodmethod,finalObject...parameters){
return"proxiado!";}
});
Agora, se você fizer o cast o proxy gerado tanto para UmaClasse e chamar metodoDaClasse() como para UmaInterface e chamar metodoDaInterface(), ele vai retornar "proxiado!".
Blz? Flw! :thumbup:
Z
zoren
No meu esse seu código continua dando o mesmo erro.
Deixa prá lá, depois eu dou um jeito nisso.
No início, eu tentei usar igual o Proxy do Java, mas também não deu em nada.
Vlw pela ajuda.
J
jonasabreu
Olá zoren,
acabei de conseguir reproduzir o erro na minha máquina. Parece que aconteceu algum problema depois da montagem do jar (para evitar conflito de dependências optamos por inserir as classes do cglib dentro do jar e modificar os pacotes.)
Estou sem tempo agora mas no fim de semana olho isso e assim que corrigido lanço um versão corrigindo o problema.
Valeu pelo aviso!
R
Raphael_Lacerda
Iae Jonas tudo bom?
Cara, parabéns!
To usando a versão 1.5 do mirror lá no BB fazendo bastante propaganda dele!
Deixa eu te fazer uma pergunta…
Atualmente, a classe GetterHandler tem os métodos para acessar os Fields do objeto.
Tem algum jeito para acessar os Methods do objeto?
G
garcia-jj
Uma pena que assim um jar que antes era 72K atualmente tem + de 500K.
Agora pergunto: mirror é uma espécie de facilitade para reflection, inclusive o nome é bem intuitivo, sendo assim faz sentido o mirror criar proxies? Não seria uma responsabilidade além do core do mirror?
O tamanho me incomoda também. Mas ainda acho melhor do que o possível clash de versões com hibernate por aí…
Sobre proxys, isso é algo que pensei durante muito tempo. Realmente, suporte a proxys fica em lugar meio cinza entre reflection e o resto do mundo (mesmo estando no pacote j.l.r). O meu principal ponto para adicionar o suporte a proxy é que (como comentou uma vez um amigo meu, o Rafael Ferreira), o objetivo do Mirror é se tornar uma caixinha de Magia Negra fácil de usar para o meta-modelo de objetos do Java. Criar proxys deveria ser algo bem simples em qualquer linguagem, mas em Java não é bem assim. Pensando em tudo isso resolvi começar a atacar essa “zona cinza” também.
Mas realmente é algo que fica um pouco fora dos objetivos iniciais (substituir o ReflectionUtils) mesmo que me ajude no dia-a-dia.
G
garcia-jj
Jonas, muito bom =).
Posso sugerir para quando sair uma nova versão de derrepente ter um mirror.jar e um mirror-proxy.jar? Digamos que deixar apenas o core do mirror de um lado, e plugins/extras de outro. Enfim, uma sugestão apenas.
Você pode testar a versão que acabei de lançar (1.6.1)? Os testes que eu fiz para reproduzir o seu problema passam agora. A diferença é que agora é necessário adiconar o cglib ao seu classpath para utilizar a parte de proxys. As instruções estão em [url]http://projetos.vidageek.net/mirror-pt/proxy/[url]
Acabei movendo a dependencia para fora do Mirror mesmo. O Jar ainda está um pouco maior (137Kb) que o da versão 1.5.1 (72Kb) porque mantive o objenesis.
Acabei movendo a dependencia para fora do Mirror mesmo. O Jar ainda está um pouco maior (137Kb) que o da versão 1.5.1 (72Kb) porque mantive o objenesis.