Bom dia
Gostaria por favor de saber se tem como eu em tempo de execução criar ou apenas acessar a classe, meu objetivo é o seguinte tenho uma classe abstrata que contem métodos que são utilizados por herança em outras 7 classes diferentes…
Seriam cômodos de uma casa as classes concretas e a abstrata o interruptor de luz, que seria para ligar e desligar lâmpada, então eu queria utilizar isso em sockets, aonde eu enviaria o nome do comodo, quarto por exemplo e ele acessaria o metodo desligaLuz() ou statusLampada da classe para efetuar a ação, então queria utilizar isso para deixar o código mais eficiente.
Eu vi que tem reflection…
Cheguei a criar um trecho de código mas da mensagem de erro.
public void criaClasse(String nomeClasse, int opcao) {
String nome = "socket.casa.concreta.".concat(nomeClasse);
try {
Class classe = Class.forName(nome);
Interruptor objeto = (Interruptor) classe.newInstance();
switch (opcao) {
case 1:
((Interruptor) objeto).interruptor();
break;
case 2:
((Interruptor) objeto).getStatusLampada();
break;
}
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException e) {
e.printStackTrace();
}
}
Mensagem de erro da pilha
java.lang.InstantiationException: socket.casa.concreta.Quarto
at java.lang.Class.newInstance(Unknown Source)
at socket.casa.Casa.criaClasse(Casa.java:40)
at socket.casa.Casa.main(Casa.java:60)
Alguém poderia me ajudar por favor?
Não tem como criar classes em tempo de execução.
Mas é possível instanciar objetos, com base no nome da classe.
O erro que deu é que ele não encontrou a classe Quarto, ou não encontrou um construtor vazio nessa classe.
Isso também daria erro, pois não creio que Interruptor seja filho de Quarto.
[quote=ViniGodoy]Não tem como criar classes em tempo de execução.
Mas é possível instanciar objetos, com base no nome da classe.
O erro que deu é que ele não encontrou a classe Quarto, ou não encontrou um construtor vazio nessa classe.
Isso também daria erro, pois não creio que Interruptor seja filho de Quarto.[/quote]
Na super classe eu passo parâmetro no construtor com o nome do cômodo…
O newInstance() vai chamar o construtor padrão. Se quer chamar um construtor com um parâmetro, tem que usar o getConstructor() e passar o parâmetro para ele.
Por favor, teria algum exemplo para eu ver?
Obrigado
Consegui fazer isso retirando do construtor o parâmetro, pois eu percebi já não era mais necessário usando apenas a instanciação em tempo de execução.
Obrigado
Acho que sei o que causou a dúvida no amigo do post.
No youtube tem um vídeo do Professor Neri que mostra um tipo de programa que cria programas em java.
Ou seja você vai marcando as coisas que quer e no final ele gera todo o código para você.
Deve ser em algo assim que o amigo deveria ter pensado.
De fato só tentei relembrar um fato que possa ter gerado o tema.
[quote=JavaDreams]Acho que sei o que causou a dúvida no amigo do post.
No youtube tem um vídeo do Professor Neri que mostra um tipo de programa que cria programas em java.
Ou seja você vai marcando as coisas que quer e no final ele gera todo o código para você.
Deve ser em algo assim que o amigo deveria ter pensado.
De fato só tentei relembrar um fato que possa ter gerado o tema.[/quote]

Segue o código que fiz…
classe abstrata
public abstract class Comodo {
private boolean lampada;
private String nomeDaClasse;
public Comodo() {
nomeDaClasse = "\n" + getClass().getSimpleName();
nomeDaClasse = nomeDaClasse.concat(" - lâmpada ");
}
public String acionarInterruptor() {
this.lampada = this.lampada == false ? true : false;
return nomeDaClasse + (this.lampada == true ? " ligada" : " desligada") + "\n";
}
public String getStatusLampada() {
return nomeDaClasse + (this.lampada == true ? " ligada" : " desligada") + "\n";
}
}
classe concreta banheiro
public class Banheiro extends Comodo {
}
classe casa que cria os cômodos da casa
public class Casa {
private List<Comodo> comodos;
private String[] nomeDosComodos = { "Banheiro", "Copa", "Corredor", "Cozinha", "Garagem", "Quarto", "Varanda" };
public Casa() {
this.comodos = new ArrayList<>(this.nomeDosComodos.length);
}
public void criaCasa() {
for (int i = 0; i < this.nomeDosComodos.length; i++) {
this.comodos.add(criaClasse(this.nomeDosComodos[i]));
}
}
private Comodo criaClasse(String nomeClasse) {
String caminhoClasse = "socket.casa.concreta." + nomeClasse;
Class<?> classe = null;
Comodo objeto = null;
try {
classe = Class.forName(caminhoClasse);
objeto = (Comodo) classe.newInstance();
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | SecurityException e) {
e.printStackTrace();
}
return objeto;
}
public List<Comodo> getComodos() {
return this.comodos;
}
}