Pessoal, é possível criar novos objetos (como classes, pacotes e etc) em um projeto em tempo de execução?
Caso sim, alguem teria um exemplo?
Obrigado.
Pessoal, é possível criar novos objetos (como classes, pacotes e etc) em um projeto em tempo de execução?
Caso sim, alguem teria um exemplo?
Obrigado.
É; na verdade, cada vez que você usa reflection, o Java transparentemente cria classes escondidas para acelerar o processo de reflection, por exemplo.
Você pode usar uma de duas coisas:
a) Se você quer gerar a classe nova a partir de código Java gerado em tempo de execução, pode incluir o compilador Java no seu programa (pacote javax.tools, requer mandar o tools.jar junto com sua aplicação).
http://docs.oracle.com/javase/7/docs/api/javax/tools/package-summary.html#package_description
b) Se você quer gerar a classe nova a partir de bytecodes, você pode fazer isso usando algum pacote como o ASM ( http://asm.ow2.org/ ).
Nada muito avançado, mas veja no link deste tópico. Pode ser que ajude um pouco:
[quote=entanglement]É; na verdade, cada vez que você usa reflection, o Java transparentemente cria classes escondidas para acelerar o processo de reflection, por exemplo.
Você pode usar uma de duas coisas:
a) Se você quer gerar a classe nova a partir de código Java gerado em tempo de execução, pode incluir o compilador Java no seu programa (pacote javax.tools, requer mandar o tools.jar junto com sua aplicação).
http://docs.oracle.com/javase/7/docs/api/javax/tools/package-summary.html#package_description
b) Se você quer gerar a classe nova a partir de bytecodes, você pode fazer isso usando algum pacote como o ASM ( http://asm.ow2.org/ ).
[quote]
ASM is an all purpose Java bytecode manipulation and analysis framework. It can be used to modify existing classes or dynamically generate classes, directly in binary form.
[/quote][/quote]
A minha necessidade seria o item “a)” citado, mas não estou com o projeto aqui no trabalho, vou verificar melhor o link com a documentação que você me passou.
Obrigado.
[quote=ul1sses]Nada muito avançado, mas veja no link deste tópico. Pode ser que ajude um pouco:
Pootz, tinha um tópico esses dias, rsrs. Eu não cheguei a procurar no forum de Java avançado, mas enfim.
Vi que você conseguiu solucionar o teu problema naquele tópico.
Apenas uma dúvida. No código que você postou você compilou uma classe Usuário.java.
Digamos que você necessite dela num próximo momento, em outra sessão, ela estará disponível?
Em outras palavras, em um sistema desktop, ao finalizar a execução do programa e executar ele posteriormente, você precisará compilar novamente a classe Usuário ou ela já fará parte do projeto?
Obrigado.
Do jeito que eu fiz não é muito utilizável se você for usar em uma aplicação desktop final dentro de um JAR. O meu foi mais pra criar um utilitário pra um “framework” pessoal, para utilizar com o eclipse.
De qualquer maneira, você vai poder gerar o .java e compilá-lo para gerar o .class e salvar em qualquer lugar. O que não sei te dizer exatamente é como carregar à partir desse local. Acho que um class loader da vida. Não posso te dar certeza no momento. Vou dar uma pesquisada também.
Verifica se este exemplo pode te ajudar:
[quote=ul1sses]Do jeito que eu fiz não é muito utilizável se você for usar em uma aplicação desktop final dentro de um JAR. O meu foi mais pra criar um utilitário pra um “framework” pessoal, para utilizar com o eclipse.
De qualquer maneira, você vai poder gerar o .java e compilá-lo para gerar o .class e salvar em qualquer lugar. O que não sei te dizer exatamente é como carregar à partir desse local. Acho que um class loader da vida. Não posso te dar certeza no momento. Vou dar uma pesquisada também.
Verifica se este exemplo pode te ajudar:
http://www.exampledepot.com/egs/java.lang/loadclass.html[/quote]
Na verdade a aplicação desktop foi apenas um exemplo, pra saber o funcionamento.
O que estou projetando é um ambiente web. Aí digamos que o usuário 1 “crie” um objeto novo, esse objeto esteja disponível para o usuário 2, que acessará a aplicação simultaneamente ou após o usuário 1.
Quanto ao link vou verificar melhor ele, obrigado.
No caso da aplicação WEB acredito que quando for feito novamente deploy ou reload a tua classe vai se perder. Por que o teu projeto fica em um arquivo WAR,EAR,ETC… Quando você inicia o servidor tomcat/jboss/… ele extrai isso em um diretório temporário e usa os dados ali presentes. Alguém me corrija se eu estiver equivocado, por favor.
Pergunta: é realmente necessária a criação de uma classe em runtime? Será que seu problema não teria alguma outra solução? Compartilhe o problema se não for nada ultra secreto. hehe
[quote=ul1sses]No caso da aplicação WEB acredito que quando for feito novamente deploy ou reload a tua classe vai se perder. Por que o teu projeto fica em um arquivo WAR,EAR,ETC… Quando você inicia o servidor tomcat/jboss/… ele extrai isso em um diretório temporário e usa os dados ali presentes. Alguém me corrija se eu estiver equivocado, por favor.
Pergunta: é realmente necessária a criação de uma classe em runtime? Será que seu problema não teria alguma outra solução? Compartilhe o problema se não for nada ultra secreto. hehe[/quote]
A criação de classes em runtime foi uma idéia que tive, aí vim procurar meios para se fazer isso. Porém, caso seja algo que vá gerar um emaranhado de código vou ter que procurar uma outra solução e estou aberto a sugestões, hehe.
Esse meu projeto na verdade é para o meu TCC, que é na área de IA. Ele tem ênfase no processamento de linguagem natural, ou seja, a máquina conseguir entender o que você “fala” pra ela. O que vi em muitos casos são “respostas fixas”, por exemplo: Se o usuário disser “oi”, responda com “Olá”, “oi”, “como vai” ou “bom dia”, geralmente através de tags em um xml. O que quero fazer é um pouco diferente e pra isso preciso de objetos.
A minha ideia é criar algo que se comunique melhor com o usuário, de forma a compreender realmente sobre o que o mesmo está tratando. Vamos pegar como exemplo uma especie de planta rara, pode até ser com o nome cientifico. Em um primeiro momento o usuário será questionado pelo sistema sobre o que é isso, visto que essa definição ainda não é conhecida. Caso esse mencione que é uma espécie de planta, seria criada uma classe com o nome dessa especie, efetuando um extends em Planta, por exemplo. Através de Planta, o sistema saberá suas características gerais, pedindo apenas informações adicionais sobre essa espécie. Através dessas informações seriam criados alguns atributos dessa classe, que a identificariam como única.
A idéia bem dizer é essa, estou procurando soluções para implementá-la e como disse estou aberto a sugestões.
Agradeço a ajuda.
Ai neste caso não posso lhe ajudar muito, pois nunca desenvolvi algo relacionado I.A. Não sei te dizer qual seria a melhor metodologia ao tentar resolver seu problema.
Basta você salvar os .class em algum diretório que estiver no CLASSPATH do seu programa.
Opa, vou tentar isso mesmo. Qualquer dúvida retorno ao tópico.
Obrigado a todos.
Estava com uma ideia parecida com esta quando estava na faculdade, no momento nao entendia muito de java, meus professores falavam que isto nao era possivel, mais a ideia sempre ficou na minha cabeça.
Um outro professor disse que já existia uma ideia assim, gostaria de compartilhar a informação para projetarmos alguma coisa juntos.
Hoje conheço mais sobre java e algumas ferramentas que podem ser utilizadas para montar o projeto
Quero muito participar, mantenha contato.
Algumas ideias:
Vejo alguma complexidade em gerar compiladores java, imagino que isso não seja necessário pois já temos compiladores free (obviamente).
Para suprir este problema temos uma base de dados (pode ser até mysql) que possui os codigos fontes dos metodos e nomes, geramos os arquivos java desses dados.
para avaliar a execucao do codigo e indo modificando-o conforme a Inteligencia artificial progride, fazemos o seguinte, um programa checa o resultado da funcao ou metodo executando o class, dependendo do resultado, acessamos a base de dados, geramos novo arquivo class , compilamos e o executamos novamente.
Ferramentas como OSGI, JUnit, Ant podem ser utilizados nesse processo, talvez alguma automatização com sistemas de integração contínua como o HUDSON, essa é a ideia básica.
Quando estava fazendo faculdade, aprendí que um estudo deste tamanho é grande, sucetível a fracassos, a sua tese está pronta a aceitar este fato?
Por outro lado, como cientista, o fracasso está sempre presente, veja o caso de Edson que após mil tentativas fracassadas, descobriu a lampada na tentativa mil e um.
Outra alternativa mais simples é estudar bastante os recursos da orientação a objetos e os padroes de projeto do GoF eles podem ser uma alternativa para modificacao do comportamento do código em tempo de execução.
[quote=renatogrosz]Estava com uma ideia parecida com esta quando estava na faculdade, no momento nao entendia muito de java, meus professores falavam que isto nao era possivel, mais a ideia sempre ficou na minha cabeça.
Um outro professor disse que já existia uma ideia assim, gostaria de compartilhar a informação para projetarmos alguma coisa juntos.
Hoje conheço mais sobre java e algumas ferramentas que podem ser utilizadas para montar o projeto
Quero muito participar, mantenha contato.
Algumas ideias:
Vejo alguma complexidade em gerar compiladores java, imagino que isso não seja necessário pois já temos compiladores free (obviamente).
Para suprir este problema temos uma base de dados (pode ser até mysql) que possui os codigos fontes dos metodos e nomes, geramos os arquivos java desses dados.
para avaliar a execucao do codigo e indo modificando-o conforme a Inteligencia artificial progride, fazemos o seguinte, um programa checa o resultado da funcao ou metodo executando o class, dependendo do resultado, acessamos a base de dados, geramos novo arquivo class , compilamos e o executamos novamente.
Ferramentas como OSGI, JUnit, Ant podem ser utilizados nesse processo, talvez alguma automatização com sistemas de integração contínua como o HUDSON, essa é a ideia básica.
Quando estava fazendo faculdade, aprendí que um estudo deste tamanho é grande, sucetível a fracassos, a sua tese está pronta a aceitar este fato?
Por outro lado, como cientista, o fracasso está sempre presente, veja o caso de Edson que após mil tentativas fracassadas, descobriu a lampada na tentativa mil e um.
Outra alternativa mais simples é estudar bastante os recursos da orientação a objetos e os padroes de projeto do GoF eles podem ser uma alternativa para modificacao do comportamento do código em tempo de execução.
[/quote]
Estou na correria e nao consegui voltar ao tópico antes…
Você chegou a iniciar o desenvolvimento na época ou ficou apenas como uma idéia?