Alterar tipo de retorno de um método interceptado em tempo de execução

5 respostas
ul1sses

Tendo como exemplo:

public class Teste {

    public Integer testar() {
        return 100;
    }

}

Criando um proxy para Teste.class eu consigo interceptar a chamada do método testar().
Gostaria de saber se existe a possibilidade de retornar, por exemplo, uma String “testando” no lugar de 100 quando o método testar() for chamado?

5 Respostas

Rodrigo_Sasaki

Conseguir você até consegue, mas por que faria isso?

Quem chamou o método não vai aceitar o tipo de retorno, provavelmente será lançada alguma RuntimeExeption.

E a ideia do padrão Proxy, é que a interface dele seja exatamente igual ao do objeto procurado, não?

ul1sses

Vamos supor que tenho um POJO:

public class Pojo {
	
	private Integer numero;
	
	public Integer getNumero() {
		return numero;
	}
	
	public void setNumero(Integer numero) {
		this.numero = numero;
	}
	
}

E tenho uma classe que mapeia certas configurações de acordo com os atributos do POJO:

...
	Configuracao config = new Configuracao(Pojo.class);
	config.add("numero", TipoNegocio.ALGUM_TIPO);
..

Gostaria de mudar para algo do tipo:

...
	Configuracao config = new Configuracao(Pojo.class);
	Pojo pojoProps = ProxyEntidade.criar(Pojo.class);
	config.add(pojoProps.getNumero(), TipoNegocio.ALGUM_TIPO);
..

Caso eu precise refatorar o POJO, por exemplo, eu não precisaria me preocupar em alterar o mapeamento.

Bom, esta é minha ideia. Se eu estiver viajando ou alguém quiser opinar sobre uma solução mais simples, eu estou aberto a sugestões.

Agradeço antecipadamente. :slight_smile:

P

Boa tarde ul1sses.
Uma possível solução seria:

public <T> T testar(Class<T> type){
		...
	}

Ex:

Integer result = object.testar(Integer.class);
String result = object.testar(String.class);
MyType result = object.testar(MyType.class);
ul1sses

plic_ploc:
Boa tarde ul1sses.
Uma possível solução seria:

public <T> T testar(Class<T> type){
		...
	}

Ex:

Integer result = object.testar(Integer.class);
String result = object.testar(String.class);
MyType result = object.testar(MyType.class);

Minha preferencia é por não ter que alterar a estrutura atual do POJO.

WellingtonRamos

Rodrigo Sasaki:
Conseguir você até consegue, mas por que faria isso?

Quem chamou o método não vai aceitar o tipo de retorno, provavelmente será lançada alguma RuntimeExeption.

E a ideia do padrão Proxy, é que a interface dele seja exatamente igual ao do objeto procurado, não?

Precisa trocar o retorno para Object e quem chama verificar qual foi o tipo devolvido e tratar corretamente.

Entretanto, é uma necessidade muito estranha essa…

Criado 1 de fevereiro de 2013
Ultima resposta 1 de fev. de 2013
Respostas 5
Participantes 4