Como instânciar uma classe recebida por parâmetro?

3 respostas
vininewday

Olá amigos, tudo bem? :D

Estou construindo uma classe Builder (Fluent Interface) para gerar gráficos. As classes que serão utilizadas por este Builder extendem a classe GeraGrafico. Utilizo este processo para permitir baixo acoplamento ao tipo de gráfico que este quer gerar, sendo que cada implementação de GeraGrafico decide qual tipo de gráfico será construido.

public <T extends GeraGrafico> Object tipoDeGrafico(Class<T> classeGeraGrafico) throws InstantiationException, IllegalAccessException {
		
                tipoDeGrafico = classeGeraGrafico.newInstance();
		return this;
}

Este código acima retornará uma InstantiationException, pois a classe passada como parâmetro possui apenas um Construtor com parâmetros.

Exemplo de chamada do método:

GeradorDeGrafico.tipoDeGrafico(GeraGraficoCandleStick.class);

:!: Problema:

A classe abstrata GeraGrafico possui um construtor com parâmetros e suas classes filhas apenas o sobrescrevem. Preciso saber uma maneira de passar os parâmetros para o construtor.

Alguem tem noção de como posso resolver isto :?:

3 Respostas

mmaico

Olá,

Você precisa recuperar os construtores ou construtor e então chamar o newInstance passando o parametro, segue:

classeGeraGrafico.getConstructor(TipoDoAtributoQueOConstrutorRecebe.class).newInstance(parametroDoConstrutor);

abraço!

vininewday

Olá mmaico :smiley: ,

Muito obrigado, o código que me passou funcionou! :lol:

Onde você encontrou a solução :?: Olhando apenas no JavaDoc :?:

mmaico

e ai vininewday,

Sim, mas eu já tinha feito isso antes.

JavaDoc
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html

Depois eu passei a usar o Mirror para fazer essa parte de reflection, fica muito mais facil e o código mais legivel, se tiver curiosidade dê uma olhada no link:
http://blog.caelum.com.br/mirror-dsl-facilitando-o-uso-da-api-de-reflection/

abraço!

Criado 19 de novembro de 2012
Ultima resposta 19 de nov. de 2012
Respostas 3
Participantes 2