2013-06-03 17 views
11

Ho un'app che mi piacerebbe rendere estendibile consentendo agli utenti di definire le classi in Groovy, eventualmente implementando alcune interfacce.Compilare e utilizzare le classi di Groovy da Java in fase di runtime?

L'aspetto chiave è che deve essere interpretato/compilato in fase di esecuzione. Cioè Ho bisogno della mia app per prendere lo .groovy e compilarlo. Farlo durante l'avvio è ok.

Quindi, ovviamente, la mia app dovrebbe essere in grado di creare un'istanza di quella classe.

Vedo due soluzioni:

1) Compilare durante l'esecuzione di applicazioni, mettere le classi da qualche parte sul percorso di classe, e poi basta caricare le classi, fingendo erano sempre lì.

2) Un modo più intelligente: chiamare un'API del compilatore e alcune funzioni di caricamento automatico della classe per consentire al mio classloader del sistema di visualizzarle.

Come scegliere l'opzione 2)?
Altre idee?

risposta

8

Dai un'occhiata alla classe Integrating Groovy into applications

  • Get Loader
  • Classe di carico
  • classe Instantiate.

Beauty: -
Dal .groovy viene compilato in bytecode .class, l'analisi della classe darebbe un instanceofClass. Ora diventa tutto il mondo JAVA, unica differenza, una volta ottenuto lo GroovyObject dopo l'instantiatiation, si gioca intorno a invocare metodi su richiesta.

Edit: Solo così è contenuta qui:

InputStream groovyClassIS = GroovyCompiler.class 
    .getResourceAsStream("/org/jboss/loom/tools/groovy/Foo.groovy"); 

GroovyClassLoader gcl = new GroovyClassLoader(); 
Class clazz = gcl.parseClass(groovyClassIS, "SomeClassName.groovy"); 
Object obj = clazz.newInstance(); 
IFoo action = (IFoo) obj; 
System.out.println(action.foo()); 

e

package org.jboss.loom.migrators.mail; 

import org.jboss.loom.tools.groovy.IFoo; 

public class Foo implements IFoo { 
    public String foo(){ 
     return "Foooooooooo Action!"; 
    } 
} 
Problemi correlati