É com humildade que venho apresentar a vocês a bibliotéca que criei: Reflector.
Como é de se adivinhar, o Reflector é uma biblioteca que criei para facilitar a utilização do Reflection API.
Ao desenvolve-la, tive como foco facilidade de uso e performance.
1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
j0nny
Marky.Vasconcelos:
1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky :lol:
Mikhas
j0nny:
Marky.Vasconcelos:
1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky :lol:
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel
j0nny
Mikhas:
j0nny:
Marky.Vasconcelos:
1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky :lol:
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel ;)
Será que com a Dalvik do Android o desempenho será tao satisfatório assim também?
Pois estou quase liberando a primeira versão do AndOrm, com as funções básicas.
PS: Pq não coloca no GitHub? Fica mais fácil e legal do pessoal contribuir
Mikhas
j0nny:
Mikhas:
j0nny:
Marky.Vasconcelos:
1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky :lol:
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel ;)
Será que com a Dalvik do Android o desempenho será tao satisfatório assim também?
Pois estou quase liberando a primeira versão do AndOrm, com as funções básicas.
PS: Pq não coloca no GitHub? Fica mais fácil e legal do pessoal contribuir
Creio que no Android ele não utilizará as features “mothafocka” deixando a performance semelhante a da API padrão.
É que eu já uso SVN e estou acostumado. Sem falar que uso Windows.
j0nny
Mikhas:
j0nny:
Mikhas:
j0nny:
Marky.Vasconcelos:
1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky :lol:
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel ;)
Será que com a Dalvik do Android o desempenho será tao satisfatório assim também?
Pois estou quase liberando a primeira versão do AndOrm, com as funções básicas.
PS: Pq não coloca no GitHub? Fica mais fácil e legal do pessoal contribuir
Creio que no Android ele não utilizará as features “mothafocka” deixando a performance semelhante a da API padrão.
É que eu já uso SVN e estou acostumado. Sem falar que uso Windows.
Ah ok, então nem valeria a pena. MASSS, vou fazer um teste a parte mais tarde para comprovar :lol:
Tbm usava SVN e Windows, agora uso Ubuntu e GitHub para projetos pessoais, e Ubuntu e SVN profissionalmente.
Alexandre_Saudate
Mikhas:
j0nny:
Mikhas:
j0nny:
Marky.Vasconcelos:
1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky :lol:
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel ;)
Será que com a Dalvik do Android o desempenho será tao satisfatório assim também?
Pois estou quase liberando a primeira versão do AndOrm, com as funções básicas.
PS: Pq não coloca no GitHub? Fica mais fácil e legal do pessoal contribuir
Creio que no Android ele não utilizará as features “mothafocka” deixando a performance semelhante a da API padrão.
É que eu já uso SVN e estou acostumado. Sem falar que uso Windows.
Dá pra usar sossegado o GitHub usando TortoiseGit. Só muda mesmo o estilo, que é um pouco diferente do SVN.
[]´s
jonasabreu
Olá Mikhas,
Boa iniciativa! Não achei que o Mirror estivesse com a performance tão ruim para reflection. Você pode disponibilizar o benchmark para eu dar uma olhada? O problema deve estar no lookup do método.
De qualquer forma parece que está bem simples de usar. Gostei da API (Tirando que o acesso a ela é via métodos static, mas se seu foco é performance, acho que faz sentido.)
Algumas perguntas porque ainda não tive tempo de olhar bem o código
1 - É Thread-safe?
2 - Os truques para acelerar envolvem sun.misc.Unsafe e sun.reflect.*Accessor? Ou você encontrou algo ainda mais baixo?
3 - Javassist para analize do bitecode certo? Você chegou a medir os ganhos de performance? Eu estava pensando em fazer isso pro Mirror, mas se já tiver dados melhor ainda
Mikhas
jonasabreu:
Olá Mikhas,
Boa iniciativa! Não achei que o Mirror estivesse com a performance tão ruim para reflection. Você pode disponibilizar o benchmark para eu dar uma olhada? O problema deve estar no lookup do método.
De qualquer forma parece que está bem simples de usar. Gostei da API (Tirando que o acesso a ela é via métodos static, mas se seu foco é performance, acho que faz sentido.)
Algumas perguntas porque ainda não tive tempo de olhar bem o código
1 - É Thread-safe?
2 - Os truques para acelerar envolvem sun.misc.Unsafe e sun.reflect.*Accessor? Ou você encontrou algo ainda mais baixo?
3 - Javassist para analize do bitecode certo? Você chegou a medir os ganhos de performance? Eu estava pensando em fazer isso pro Mirror, mas se já tiver dados melhor ainda :)
Não fiz testes com varias threads, só testes funcionais, mas acredito que tem haverá muitos problemas pois os proxies possuem em sua maioria atributos finais.
Eu utilizo o Unsafe quando possivel e o javassist para criar proxies também. Não o utilizei para analize de bytecode já que nunca vi isso na vida… mas esta ai uma coisa para correr atrás.
O teste de performance que fiz é bem simples na verdade: ReflectorPerformanceTest
Tentei ser o mais just possivel com todas as API’s.
G
garcia-jj
O tópico está duplicado. Há outro igual no sub-forum para projetos brasileiros.
A iniciativa é boa, a documentação está bem clara e tem uma boa wiki (bem simplese direta).
Mas não gostei de ter uma javassist embedded por dois motivos: o jar fica grande, e isso pode ocasionar classloader hell caso o usuário tenha outra versão do javassist. Meu conselho é não usar assim ou renomear de javassist.* para br.mikhas.reflector.*, que é o que o pessoal faz quando distribui coisas embedded.
Na classe principal há um map que guarda um cache dos proxies criados pelo Javassist. É bom cuidar com essas coisas staticas, pois não são thread-safe.
Eu fiquei mesmo impressionado com o gráfico. Ser mais rápido que o Mirror ou outra lib semelhante pode ser, mas ser mais rápido que o JDK, só se usar cache. Mas isso por outro lado é perigoso por causa do acumulo de memoria e também com o cuidado de guardar esse cache thread-safe.
Usando classes internas da VM dá pra ser consideravelmente mais rápido que a VM pois você consegue ignorar várias checagens de segurança. Além de que no caso de fields, você consegue acesso direto à memória usando o sun.misc.Unsafe.
Usando classes internas da VM dá pra ser consideravelmente mais rápido que a VM pois você consegue ignorar várias checagens de segurança. Além de que no caso de fields, você consegue acesso direto à memória usando o sun.misc.Unsafe.
]
Hmm, muito interessante. Eu ví isso se não me engano no Objenesis, onde há algumas implementações usando recursos internos específicas das VMs.
jonasabreu
Sim. O XStream também usa coisas assim para acelerar reflection.
Paulo_Silveira
Ola
Muito bom, tem ate testes.
Usar sun.misc não é portavel infelizmente. Nao vai funcionar no openjdk, por exemplo. E provavelmente tambem nao na jvm da IBM… haverá ClassDefNotFoundError.
Mas existem bibliotecas que encapsulam essas chamadas especificas, assim como o XStream e o Objenesis fazem. Ai fica “seguro”.
Usando classes internas da VM dá pra ser consideravelmente mais rápido que a VM pois você consegue ignorar várias checagens de segurança. Além de que no caso de fields, você consegue acesso direto à memória usando o sun.misc.Unsafe.
Jonas, deve ser bem facil mudar a implementacao pra ficar mais rapido, mas acho ate um pouco desnecessario na maioria absoluta dos casos: a diferenca de gastar 1 nano segundo e 10 nanosegundos, numa operacao que só faremos 1 vez num request web, é mais que negligenciavel. Prefiro que continuem utilizando a reflection pura e mantenha compatibilidade da maneira simples.
jonasabreu
Bom, nada impede que essas próprias bibliotecas para facilitar reflection encapsulem essa lógica, como fiz no Mirror com o reflection provider específico para a VM da Sun.
Concordo que para uma requisição web é o ganho é praticamente desprezível mas não sei se todos os casos de uso de reflection se encaixam aí, em especial se essa otimização estiver bem encapsulada.
Marky.Vasconcelos
Po, se conseguirem deixar isso portavel sem a VM da Sun, eu usaria no Towel, tem bastante Reflection lá, usar algo mais rapido seria interessante. Mesmo que no momento seja inperceptivel o tempo que leva, acho razoavel utiliza-la.
Mikhas
Tomei o cuidado que pudi para a biblioteca verificar qual a melhor implementação utilizar dependendo do que estiver disponivel no ambiente.
Se nenhum “recurso avançado” estiver disponivel, ela vai utilizar a implementação padrão da JDK.
Pretendo correr atrás de outras optimizações ainda que possam ser utilizadas em outras plataformas.
jonasabreu
Marky.Vasconcelos
Basicamente o problema é que acelerar reflection com coisas específicas de VMs exige praticamente um código para cada VM. Mas provavelmente na maioria delas é possível escrever código assim. Mas na prática, com a quantidade de gente que usa a VM da Sun, um speedup para essas VMs já pode ajudar seus usuários.
Mas otimização precoce é a raiz de todos os males. Veja se realmente vale a pena migrar seu código para receber ganhos que praticamente só aparecem com o uso bem intensivo de reflection.
Alexandre_Saudate
Interessante a proposta de ambas as API’s. Vou estudar usá-las no próximo sub-projeto do Banshee.
Parabéns a ambos os desenvolvedores!
[]´s
Alexandre_Saudate
Caros,
Estou muito interessado na feature de construir um objeto sem passar pelo construtor. Isso porque um dos subprojetos do Banshee tenciona fazer parsing de XML para objeto (de uma maneira bem especial ) e, pra isso, seria bastante interessante conseguir construir os objetos e ir populando com os dados que a engine for achando no XML. Só que legal mesmo seria se a engine conseguisse construir os objetos necessários sem passar pelo construtor, para que o usuário da API não precisasse se preocupar com esses detalhes.
Alguém tem sugestões a respeito?
[]´s
G
garcia-jj
asaudate:
Caros,
Estou muito interessado na feature de construir um objeto sem passar pelo construtor. Isso porque um dos subprojetos do Banshee tenciona fazer parsing de XML para objeto (de uma maneira bem especial ) e, pra isso, seria bastante interessante conseguir construir os objetos e ir populando com os dados que a engine for achando no XML. Só que legal mesmo seria se a engine conseguisse construir os objetos necessários sem passar pelo construtor, para que o usuário da API não precisasse se preocupar com esses detalhes.
Sim, eu estava conferindo o Objenesis agora. Só que (esquecí de mencionar, sorry!) me preocupei com o fato de ele ser compliant só com algumas VM´s, porque isso tem bastaaante cheiro de coisas tipo Unsafe e heresias assim. Não gostaria de ter qualquer relação com classes desse tipo no meu framework.
[]´s
G
garcia-jj
asaudate:
Sim, eu estava conferindo o Objenesis agora. Só que (esquecí de mencionar, sorry!) me preocupei com o fato de ele ser compliant só com algumas VM´s, porque isso tem bastaaante cheiro de coisas tipo Unsafe e heresias assim. Não gostaria de ter qualquer relação com classes desse tipo no meu framework.
[]´s
Outro dia ví um código que procurava pelos contrutores, e injetava null nos args caso não encontrasse o construtor no-args. Só que aí todas as classes precisam estar preparadas para receber null, o que pode acontecer também com o Objenesis.
Alexandre_Saudate
garcia-jj:
asaudate:
Sim, eu estava conferindo o Objenesis agora. Só que (esquecí de mencionar, sorry!) me preocupei com o fato de ele ser compliant só com algumas VM´s, porque isso tem bastaaante cheiro de coisas tipo Unsafe e heresias assim. Não gostaria de ter qualquer relação com classes desse tipo no meu framework.
[]´s
Outro dia ví um código que procurava pelos contrutores, e injetava null nos args caso não encontrasse o construtor no-args. Só que aí todas as classes precisam estar preparadas para receber null, o que pode acontecer também com o Objenesis.
Eu sei que o VRaptor consegue fazer algo assim, mas não estou bem lembrado se era por causa da engine do Spring ou se tinha alguma black magic envolvida…
Paulo_Silveira
Mikhas:
Tomei o cuidado que pudi para a biblioteca verificar qual a melhor implementação utilizar dependendo do que estiver disponivel no ambiente.
Se nenhum “recurso avançado” estiver disponivel, ela vai utilizar a implementação padrão da JDK.
entao ta redondinho! parabens!
G
garcia-jj
Há duas formas: a padrão faz uso do Objenesis para construir; e a segunda como fallback que procura pelos construtores e passa tudo null nos parametros.
Alexandre_Saudate
Há duas formas: a padrão faz uso do Objenesis para construir; e a segunda como fallback que procura pelos construtores e passa tudo null nos parametros.
Não tenho certeza se ficaria satisfeito com nenhuma das duas opções… tô tendencioso a obrigar o usuário a ter um construtor padrão. Afinal de contas, o JAXB faz isso e faz o maior sucesso…
[]´s
Mikhas
Valeu galera pelo apoio e pelos comentários!
Estou no aguardo de sugestões, issues, reclamações e se alguem estiver disposto a entrar no projeto, seja bem vindo!
PS.: Alguem pode me ajudar a colocar no maven a geração do pacote com fontes e javadoc?
peerless
Yet another reflection lib. . brincadeira
Pessoal, dúvida: no que vocês vem utilizando Reflection no dia-a-dia?
[]s
Alexandre_Saudate
peerless:
Yet another reflection lib. . brincadeira
Pessoal, dúvida: no que vocês vem utilizando Reflection no dia-a-dia?
[]s
Em geral, somente em frameworks (tanto os grandes, que vão em JAR´s externos, quanto micro-frameworks de uma ou duas classes, feitos pontualmente para projetos, mesmo).
[]´s
Adelar
Legal. Bastante útil
Adelar
asaudate:
peerless:
Yet another reflection lib. . brincadeira
Pessoal, dúvida: no que vocês vem utilizando Reflection no dia-a-dia?
[]s
Em geral, somente em frameworks (tanto os grandes, que vão em JAR´s externos, quanto micro-frameworks de uma ou duas classes, feitos pontualmente para projetos, mesmo).
[]´s
Fora o uso em frameworks, utilizo para simplificar regras de negócio. Reflection é uma grande ferramenta para economizar em código.
[]'s
paulofafism
Também utilizo eu frameworks próprios e também para simplificar algumas tarefas nas aplicações que desenvolvo
Javabuntu
Parabéns pelo framework, com certeza será de grande valia pra comunidade e pra você mesmo profissionalmente.
Ainda não tive tempo, mas vou verificar essa questão da performance, pois eu tenho um framework e pode ser muito útil.
peerless:
Pessoal, dúvida: no que vocês vem utilizando Reflection no dia-a-dia?
[]s
Meu último trabalho com refletion é um “Spring-LDAP-Annotation”… trabalho com ambiente de telecom com armazenamento em baseado em diretório, o spring-ldap em si é muito bom, porém faltava um esquema de annotation, então criei. :lol:
[]'s Hewerton Crisóstomo.
Javabuntu
[edit]Recebi um erro(connection closed), então postei de novo, porém o post acima foi publicado mesmo com o erro… [/edit]
Mikhas
Oi galera!
Para que baixou a biblioteca, liberei uma atualização/correão referente a chamada nativa de metodos: