Mirror DSL 1.2

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.

A título de conhecimento, existe uma API com proposta se não idêntica, muito parecida, fest-reflect. Parabéns pela iniciativa.

[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 :wink:

Outra sugestão,

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.

[code]@Override
protected void configureHibernate(AnnotationConfiguration config) {
super.configureHibernate(config);

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 :wink:
Caso gostarem da idéia, um ótimo ponto inicial para começar é estudar a seguinte classe do Spring: ClassPathScanningCandidateComponentProvider

Valeu!

Ótima idéia. Gostei!
Talvez algo usando os Matchers do hamcrest (que o JMock usa), para criar alguma forma de customizar a DSL interna.

Outra ótima idéia! Acho que esse seria mais simples. Bastaria integrar com algo como o http://scannotation.sourceforge.net/

Eu não conhecia o Hamcrest e o Scannotation. Valeu pela dica, Kung.

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:

[quote=Paulo Silveira]

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:
http://martinfowler.com/bliki/FluentInterface.html[/quote]

Legal! Isto já responde o comentário/dúvida que deixei no post http://blog.caelum.com.br/2008/11/17/mirror-dsl-facilitando-o-uso-da-api-de-reflection/

Sucesso!

[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]

Qual trecho do artigo afirma isso?

Faça uma busca pela palavra “schema” que vc encontra o trecho.

Sinceramente ainda não está claro pra mim a diferença de uma DSL interna para uma classe de utilidades que usa Method Chaining.

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.

@Mauricio,
Sobre a sua sugestão de mudança da libguagem, ela está sendo discutida na lista de desenvolvimento (http://lista.vidageek.net/listinfo.cgi/mirror-dev-vidageek.net) e acredito que vire um feature request para a próxima versão.

@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.

Obrigado a todos pelo feedback!

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]

Cara vc entrou no site pelo menos?

http://projetos.vidageek.net/mirror/method/reflecting/

[quote=jonasabreu]@Mauricio,
Sobre a sua sugestão de mudança da libguagem, ela está sendo discutida na lista de desenvolvimento (http://lista.vidageek.net/listinfo.cgi/mirror-dev-vidageek.net) e acredito que vire um feature request para a próxima versão.[/quote]

Opa Jonas,

Vou fazer umas alterações aqui e mandar pra vocês darem uma olhada :slight_smile:

Outra coisa, peloamordedeus, lista no googlegroups velho, listinfo é uma tristeza :smiley:

[quote=Foxlol]Cara vc entrou no site pelo menos?

http://projetos.vidageek.net/mirror/method/reflecting/[/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.

abraços.

[quote=OCESN][quote=Foxlol]Cara vc entrou no site pelo menos?

http://projetos.vidageek.net/mirror/method/reflecting/[/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.

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?

http://java.sun.com/javase/6/docs/api/java/lang/reflect/Method.html

[]'s

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.

http://projetos.vidageek.net/mirror/mirror/

EDITADO:

Baixei o jar aqui e realmente os exemplos do site não estão batendo com a versão 1.2.

Testou com alguma versão anterior?

Flw

Fiz uns teste aqui.

Será que isso resolve?

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
   }
}

Ai sim ele retorna objetos do tipo Method.

Se tiver outra maneira alguem posta ai.

Flw