Olá pessoal.
Estou com um problema com o Groovy que não estou conseguindo resolver de jeito nenhum.
Meu caso é o seguinte. Escrevi duas classes em Groovy (as duas estão no mesmo pacote). No momento de carregar elas em uma classe Java normal, dependendo da ordem com que eu faço o parseClass() da erro ou não.
Gostaria de saber se tem alguem com bastante experiência em Groovy que possa me dar uma luz de como é que eu faço para carregar uma quantidade X de classes Groovy sem ter que me preocupar com a ordem do parseClass().
Segue abaixo o meu código:
Arquivo “/br/teste/scripts/Livro.groovy”:
package br.teste.scripts;
class Livro {
String nome;
String autor;
Integer ano;
// construtor
Livro() {}
// construtor
Livro(String nome, String autor, Integer ano) {
this.nome = nome;
this.autor = autor;
this.ano = ano;
}
}
Arquivo “/br/teste/scripts/Estante.groovy”:
package br.teste.scripts;
import br.teste.scripts.Livro;
class Estante {
ArrayList<Livro> conteudo;
Estante() {
conteudo = [];
}
void addLivro(Livro livro) {
conteudo += livro;
}
void printLivros() {
conteudo.each { println "${it.nome} | ${it.autor} | ${it.ano}"; }
}
}
// Arquivo “/br/teste/Main.java”
package br.teste;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyCodeSource;
import groovy.lang.GroovyObject;
public class Main {
public static void main(String[] args) {
try {
String[] sources = {
"br/teste/scripts/Livro.groovy",
"br/teste/scripts/Estante.groovy"
};
// prepara um GroovyClassLoader;
GroovyClassLoader loader = new GroovyClassLoader();
for (String fileneme : sources) {
GroovyCodeSource source = new GroovyCodeSource(
loader.getResource(fileneme));
loader.parseClass(source);
}
Class objClass;
objClass = loader.loadClass("br.teste.scripts.Livro");
GroovyObject livro = (GroovyObject) objClass.newInstance();
objClass = loader.loadClass("br.teste.scripts.Estante");
GroovyObject estante = (GroovyObject) objClass.newInstance();
livro.setProperty("nome", "Groovy in Action");
livro.setProperty("autor", "CodeHaus");
livro.setProperty("ano", 2007);
estante.invokeMethod("addLivro", livro);
estante.invokeMethod("printLivros", null);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
É um código bem simples, mas esse problema esta me atrapalhando pq a idéia é colocar scripts no BD.
Mas se eu troco a ordem dos elementos do vetor “sources”, o algoritmo para de funcionar… dá erro na linha “estante.invokeMethod(“addLivro”, livro);”.
Já procurei resposta pra esse problema em varios lugares, inclusive aqui, mas só acho exemplos simples (com uma classe)…
Se alguem puder me ajudar, fico muito grato!