parabéns pelo projeto. a api de reflection ficou mais simples e em poucas linhas você já faz muita coisa.
o tal do invokeMethod é muito chato ter que verificar e tratar exceções e ficou bem mais interessante.
está lembrando algumas características do smalltalk. só não lembro agora o nome desta característica, vários métodos aninhados.
[quote=Mauricio Linhares]Repetindo a pergunta, onde está o código fonte?
E eu tinha pensado em algo assim:
Object o = Mirror.on("some.Class").create( "A String" );
Mirror.on(o).invoke( "aMethod" ).with( 13);
Mirror.on(o).get("color");
Acho bem mais intuitivo e menos burocrático :)[/quote]
Deixe-me aproveitar o gancho e dar uma sugestão ao projeto. Que tal criar junto a documentação do site uma sugestão de como se criar um ‘Wrapper’ para o Mirror, possibilitando que cada projeto possa elaborar/customizar a gramática que será usada?
Ou seja, a Mirror continua como está (que está bem legal), e ensina para seus usuários um jeito fácil de criar sua própria sintaxe usando uma classe que encapsule o Mirror.
Não sei se seria fácil, mas acho que seria bem legal
não sei se na opinião de vocês isso se enquadraria no perfil do Projeto Mirror. Mas algo que tem sido dificil de encontrar por aí de forma simples é uma forma fácil de se fazer uma busca por classes que atendam algum determinado critério no classpath.
Por exemplo: imaginem que quero encontrar todas as classes que possuam uma annotation do tipo @Entity e configurá-lo no hibernate.
List l = Mirror.onClasspath().findAll(javax.persistence.Entity.class);
for (...) { // iterar em l
Object o = l.next();
config.addAnnotatedClass(o);
}
}[/code]
Como já disse, não sei se este tipo de recurso estaria no escopo do projeto de vocês. Mas fica aqui a sugestão
Caso gostarem da idéia, um ótimo ponto inicial para começar é estudar a seguinte classe do Spring: ClassPathScanningCandidateComponentProvider
Achei bem interessante o projeto, mas se entendi bem o conceito de DSL, como não existe schema definido para representação abstrata da linguagem, ela não pode ser considerada uma DSL, seria por enquanto apenas uma classe de utilidades.
[quote=boaglio]
Achei bem interessante o projeto, mas se entendi bem o conceito de DSL, como não existe schema definido para representação abstrata da linguagem, ela não pode ser considerada uma DSL, seria por enquanto apenas uma classe de utilidades.[/quote]
creio que nao. quando a dsl é interna, estamos limitados pela sintaxe da propria linguagem (que ja possui uma sintaxe formalizada), fazendo a interseccao dela com a API exposta.
repare que o exemplo do fowler, a time and money API, nao define schema nenhum, e “segue as linhas de uma DSL”, nas proprias palavras do Fowler:
creio que nao. quando a dsl é interna, estamos limitados pela sintaxe da propria linguagem (que ja possui uma sintaxe formalizada), fazendo a interseccao dela com a API exposta.
[quote=boaglio]
Achei bem interessante o projeto, mas se entendi bem o conceito de DSL, como não existe schema definido para representação abstrata da linguagem, ela não pode ser considerada uma DSL, seria por enquanto apenas uma classe de utilidades.[/quote]
No caso específico do Mirror, foi usado Method Chaining para criar a DSL. O objetivo da DSL é manter uma “linguagem” dentro do domínio (no caso, reflection).
O method chaining é apenas encadear diversos métodos de forma a facilitar o código, mas não existe nenhum compromisso em se construir uma linguagem.
@Ednelson,
Não conhecia esta API. Vou dar uma olhada nela. Obrigado!
@Thiago Senna
Isso é uma funcionalidade (Classpath LookUp) que eu gostaria muito que existisse, mas não sei se entra no escopo do projeto.
@Kung
Usando o Hacrest, a DSL teria que ser completamente alterada por causa da forma como ele trabalha (não daria pra usar method chaining).
Ou usaria diversos imports estáticos (ruim porque pelo menos o eclipse não faz eles direito) ou usaria classes anonimas (como o JMock). Mas vale pensar sobre isso.
Alguem ai, poderia me dizer, para quem já utilizou esse framework, como pegar o nome do método, os seus parâmetros, e valores dos parâmetros em runtime?
abraços.
[quote=OCESN]Alguem ai, poderia me dizer, para quem já utilizou esse framework, como pegar o nome do método, os seus parâmetros, e valores dos parâmetros em runtime?
abraços.[/quote]
Claro que sim, o problema é pegar os seus parâmetros e valores, sem saber quais parâmetros, apenas com o nome no método.
Tipo…
public class Teste1 {
public void executa(String arg1){
TempoProcessamento tempo = new TempoProcessamento();
//blablabla.
tempo.finaliza(this);
}
}
class TempoProcessamento{
private long inicio = 0L;
private long termino = 0L;
public TempoProcessamento(){
inicio = System.currentTimeMillis();
}
public void finaliza(Object classe){
termino = System.currentTimeMillis();
System.out.println("Classe: " +classe.getClass().getName());
System.out.println("Método: " +Thread.currentThread().getStackTrace()[2].getMethodName());
//O problema??
//Pegar os argumentos, e os seus valores em RunTime.
//Lista de argumentos com os sesus respectivos valores...
//for
String param1 = "java.lang.String";
String value1 = "Teste OCESN";
System.out.println("Parâmetro: "+ param1 +"Valor: "+ value1);
//End for
System.out.println("Total: " + (termino-inicio));
}
}
ah, e para o exemplo do site deles… Method m = Mirror.on(clazz).reflect().method().withArgs(String.class, Object.class);
ao chamar o .method(), não aceita sem passar o nome de algum método.
Claro que sim, o problema é pegar os seus parâmetros e valores, sem saber quais parâmetros, apenas com o nome no método.
Tipo…
public class Teste1 {
public void executa(String arg1){
TempoProcessamento tempo = new TempoProcessamento();
//blablabla.
tempo.finaliza(this);
}
}
class TempoProcessamento{
private long inicio = 0L;
private long termino = 0L;
public TempoProcessamento(){
inicio = System.currentTimeMillis();
}
public void finaliza(Object classe){
termino = System.currentTimeMillis();
System.out.println("Classe: " +classe.getClass().getName());
System.out.println("Método: " +Thread.currentThread().getStackTrace()[2].getMethodName());
//O problema??
//Pegar os argumentos, e os seus valores em RunTime.
//Lista de argumentos com os sesus respectivos valores...
//for
String param1 = "java.lang.String";
String value1 = "Teste OCESN";
System.out.println("Parâmetro: "+ param1 +"Valor: "+ value1);
//End for
System.out.println("Total: " + (termino-inicio));
}
}
ah, e para o exemplo do site deles… Method m = Mirror.on(clazz).reflect().method().withArgs(String.class, Object.class);
ao chamar o .method(), não aceita sem passar o nome de algum método.
abraços.
[/quote]
Class clazz;
Method m = Mirror.on(clazz).reflect().method("methodName");
O código acima não te retorna um Method baseado em um nome de um método?
E com este Method você não tem as informações que vc precisa?
Cara tem não.
Consegui pegar só os paransTypes…
agora o nome do parâmetro, e os seus valores que foram setados na chamada do método, não estou conseguindo.
ah… mas uma vez…
Class clazz;
Method m = Mirror.on(clazz).reflect().method("methodName");
o método retorna um objeto do tipo MethodReflector e não um do tipo Method.
E tipo… você está com uma versão diferente do Mirror, pois os códigos que você está inserindo aqui, nenhum está batendo com a versão que estou utilizando… 1.2/ 15-Nov-2008 17:38 - , ou não está testando os códigos.
abraços.
[quote=OCESN]Cara tem não.
Consegui pegar só os paransTypes…
agora o nome do parâmetro, e os seus valores que foram setados na chamada do método, não estou conseguindo.
ah… mas uma vez…
Class clazz;
Method m = Mirror.on(clazz).reflect().method("methodName");
o método retorna um objeto do tipo MethodReflector e não um do tipo Method.
E tipo… você está com uma versão diferente do Mirror, pois os códigos que você está inserindo aqui, nenhum está batendo com a versão que estou utilizando… 1.2/ 15-Nov-2008 17:38 - , ou não está testando os códigos.
abraços.[/quote]
Cara os codigos são da propria pagina do projeto.
Não to criando nada…muito menos testando…são todos exemplos do proprio site.
Class classe = null;
List<Method> listaMetodos = Mirror.on(classe).reflectAll().methods();
String nomeMetodo = "teste";
for (Method metodo : listaMetodos) {
if (nomeMetodo.equals(metodo.getName())) {
//Do stuff
}
}