Proxy Dinamicos

Duvida…

Estou dando uma olhada, e vi que é possivel, criar classes dinamicas, porem a minha duvida é se é possivel criar uma classe similar, porem com retornos diferentes, ou isso seria apenas um sonho ??

por exemplo

public class Teste {
public void bla();
public void foo();
}

e entao usar algo como

createDinamico(Teste.class).bla().foo();

ou seja, o retorno de bla() mudaria de void para a propria classe… isso é possivel ?

Eu já cheguei a mexer no CGLIB, mas pra fazer coisa simples, que era acrescentar uma implementação padrão de uma interface a várias classes. Meio que fácil, porque o compilador não me proíbe de fazer um cast pra qualquer interface (mesmo que a classe não a implemente).

Agora, mesmo que você consiga mudar o retorno de um método (não acho que seja impossível), ainda assim o compilador irá reclamar da atribuição de variável; e você só terá a opção de invocar o método via API de reflection.

bom dia!

Uma alternativa para criar proxy dinamico tem no livro “Covert Java: Techniques for Decompiling, Patching, and Reverse Engineering”.

No capitulo 16 desse livro tem um técnica interessante usando java puro sem a necessidade de usar uma API terceira.

abraços.

usar java puro é tenso ^^

cglib rox =x

reinventar a roda é algo complicado, nem sempre vc consegue pensar nas N possibilidades

[quote=palmadias]bom dia!

Uma alternativa para criar proxy dinamico tem no livro “Covert Java: Techniques for Decompiling, Patching, and Reverse Engineering”.

No capitulo 16 desse livro tem um técnica interessante usando java puro sem a necessidade de usar uma API terceira.

abraços.[/quote]

Excelênte dica! Dei uma olhada e o livro tem ótimos exemplos de várias coisas interessantes! Obrigado pela referência! :smiley:

É que estou usando proxy para montar criteira… ate agora a montagem esta assim:


	Criteria<Telefone> query = Criteria
		.forClass(Telefone.class)
		.setFirstResult(0)
		.setMaxResults(20);
	
	Restriction<Telefone> restrict = query.addRestriction();
	
	restrict.isEquals(55).getDdi();
	restrict.isBetween(83, 85).getDdd();
	
	query.addOrder().ascIgnoreCaseBy().getNumero();
	
	//aqui vem a lisa dos telefones do ddi 55 com ddd entre 83 a 85
	List<Telefone> telefones = genericDao.list(query);
	
	//poderia ter usado genericDao.find(query); para encontra o primeiro

eu gostaria de poder trocar a ordem entre o isEqual e o getDdi por exemplo… o ideal seria assim


	Criteria<Telefone> query = Criteria
		.forClass(Telefone.class)
		.setFirstResult(0)
		.setMaxResults(20)
		.addRestriction()
			.getDdi().isEquals(55)
			.getDdd().isBetween(83, 85)	
		.addOrder()
			.ascIgnoreCaseBy().getNumero();
	
	List<Telefone> telefones = genericDao.list(query);

mas como o retorno dos métodos de Telefone são já definidos, não consigo fazer o encadeamento como queria =/