Como Criar uma instâcia de uma classe passada por parâmetro (OO)
8 respostas
kweles
Olá Pessoal tenho a classe abaixo e preciso passá-la como parâmetro para um método.
Dentro deste método preciso criar uma lista desta classe e retorná-la.
Tentei fazer passando a classe como object mas na hora que tento instanciar para fazer o list aí não consigo.
publicclassVen_notaentrada{privateIntegerid_entrada;privateIntegerid_usuarioincluiu;publicIntegergetId_entrada(){returnid_entrada;}publicIntegergetId_usuarioincluiu(){returnid_usuarioincluiu;}publicvoidsetId_usuarioincluiu(IntegeridUsuarioincluiu){id_usuarioincluiu=idUsuarioincluiu;}publicvoidsetId_entrada(IntegeridEntrada){id_entrada=idEntrada;}}publicList<Object>getById(ObjectOClass,String[]parameters){inti=0;List<Object>ocs=newList<Object>();while(i<5){OClassoc=newOClass();// aqui o compilador acusa erro oc.setId_usuarioincluiu(4);oc.setId_entrada(5);ocs.add(oc);}}
Pensei em colocar:
Objectoc=newObject();
ao invés de:
OClassoc=newOClass();
mas daí não seria uma instância da classe passada por parâmetro
Nas linhas abaixo, acredito que precisarei do reflection, mas para este funcionar, preciso q a instância seja do tipo da classe ven_notaentrada.
Vejam que preciso q seja genérico, pois irei utilizar outras classes com o mesmo método
Se você pensa em passar mais classes que tenham os mesmos atributos, então faça uma classe pai conter todos os atributos em comum, o método em questão passará a receber como parâmetro, a supreclasse.
kweles
Olá Thiago, na realidade existirão várias outras classes com diversos campos diferentes.
O que estou fazendo é um métod getById que irá realizar um select no banco de dados e retornar todos os campos
da tabela, minha idéia é que ele seja genérico para que eu possa utilizar com qualquer classe.
Com o reflection irei realizar o preenchimento dos campos set de cada classe.
Veja que a classe original era esta abaixo, mas quero fazer algo genérico como já fiz para os get´s contudo no caso do select estou com este problema.
publicList<Ven_notaentrada>getLista(intid_regional,intresumo){Stringsqlsel=" select * "+" from ven_notaentrada "+" where id_regional = ? "+" and resumo = ? ";try{List<Ven_notaentrada>notas=newArrayList<Ven_notaentrada>();PreparedStatementstmtsel=conn.prepareStatement(sqlsel);stmtsel.setInt(1,id_regional);stmtsel.setInt(2,resumo);ResultSetrssel=stmtsel.executeQuery();while(rssel.next()){Ven_notaentradaven_notaentrada=newVen_notaentrada();ven_notaentrada.setId_entrada(rssel.getInt("Id_Entrada"));ven_notaentrada.setId_usuarioincluiu(rssel.getInt("Id_UsuarioIncluiu"));ven_notaentrada.setId_situacao(rssel.getInt("Id_situacao"));ven_notaentrada.setId_origem(rssel.getInt("Id_Origem"));ven_notaentrada.setId_regional(rssel.getInt("Id_regional"));ven_notaentrada.setResumo(rssel.getInt("Resumo"));if(rssel.getDate("Dataentrada")!=null){Calendardataentrada=Calendar.getInstance();dataentrada.setTime(rssel.getDate("Dataentrada"));ven_notaentrada.setDataentrada(dataentrada);}ven_notaentrada.setM_Usuario(rssel.getInt("M_Usuario"));ven_notaentrada.setAno(rssel.getInt("ano"));ven_notaentrada.setFaturado(rssel.getInt("faturado"));if(rssel.getDate("DataPedido")!=null){Calendardatapedido=Calendar.getInstance();datapedido.setTime(rssel.getDate("DataPedido"));ven_notaentrada.setDatapedido(datapedido);}notas.add(ven_notaentrada);}rssel.close();stmtsel.close();returnnotas;}catch(SQLExceptione){thrownewRuntimeException(e);}}
J113
public List<Object> getById( Object OClass, String[] parameters ){
int i = 0;
List<Object> ocs = new List<Object>();
while(i<5){
OClass oc = new OClass(); // aqui o compilador acusa erro
oc.setId_usuarioincluiu(4);
oc.setId_entrada(5);
ocs.add(oc);
}
}
No método acima o trecho
OClass oc = new OClass(); // aqui o compilador acusa erro
Está errado, quando você usa parâmetro o objeto deve vir instanciado, o compilador está procurando um objeto chamado OClass() e o mesmo não existe.
kweles
J@rge Luis:
public List<Object> getById( Object OClass, String[] parameters ){
int i = 0;
List<Object> ocs = new List<Object>();
while(i<5){
OClass oc = new OClass(); // aqui o compilador acusa erro
oc.setId_usuarioincluiu(4);
oc.setId_entrada(5);
ocs.add(oc);
}
}
No método acima o trecho
OClass oc = new OClass(); // aqui o compilador acusa erro
Está errado, quando você usa parâmetro o objeto deve vir instanciado, o compilador está procurando um objeto chamado OClass() e o mesmo não existe.
Concordo, justamente, quero encontrar qual a forma correta de resolver este problema.
Obrigado!
thiago.correa
Dê uma pesquisada sobre DAO Genérico (Generic DAO)! Eu acho que vai ser bem mais produtivo para você do que tentar fazer um mega ultra power método populator tabajara!
kweles
Blz, thiago eu vou olhar sim. Na realidade ja consegui fazer o insert/update/delete. O Select seria apenas um plus não é tão necessário levando em conta
que cada select é um select diferente. Vou verificar!
Obrigado!
T
Tiago_Borghi
O problema é que você está passando um Object como parâmetro. Se quiser mesmo passar o object ele vai ter que estar instanciado já.
Agora, se você passar a Class como parâmetro poderia fazer dessa maneira:
Na chamada do método passa como parâmetro OClasse.class :)
Olá Thiago!
Vc tem toda a razão, nã há necessidade de passar o objeto instanciado, pois o que quero é uma lista do tipo da minha classe, estava passando um objeto erroneamente.
Mas há um problema aí.
Não posso referenciar o nome da classe Ven_notaentrada, pois a idéia é que este processo seja genérico para qualquer classe!