2010-06-22 15 views
5

Quiero importar una clase que ya escribir en una carpeta externa, por ejemplo: Mi clase Example.java que se encuentra en c:\class\Example.java a mi guión como el uso dede secuencias de comandos de Java: importar una clase desde un archivo externo

var importedClass = new JavaImporter("c:\\class\\Example.java"); 

o

importClass("c:\\class\\Example.java"); 

esto está en un guión para ScriptEngine rinoceronte
¿cómo puedo hacer eso ???

+1

¿Alguna razón por la que no puede usar la ruta de clases? –

+0

¿Desea importar una clase Java en JavaScript que se ejecutará con Rhino? ¿O desea importar una clase de JavaScript en Java utilizando Rhino? –

+0

Quiero importar una clase Java en un archivo JavaScript que se ejecutará usando Rhino :) esto es –

Respuesta

5

entiendo que desea:

  1. compilar un archivo fuente de Java
  2. carga el código compilado
  3. Utilice la clase resultante de alguna JavaScript

El paquete javax.tools proporciona una mecanismo para compilar el código, aunque si no está ejecutando en un JDK, ToolProvider.getSystemJavaCompiler() devolverá null y tendrá que confiar en som e otro mecanismo de compilación (invocando un compilador externo; incrustando el compilador de Eclipse; etc.).

Código de bytes de Java (.class binarios) se puede cargar en tiempo de ejecución a través de ClassLoader s.

Para que las clases cargadas sean visibles para su motor de scripting, deberá proporcionarlas a través del constructor ScriptEngineManager(ClassLoader).


EDIT: en base a los requisitos

public class HelloWorld { 
    public void say() { 
    System.out.println("Hello, World!"); 
    } 
} 

Este script simplemente invoca la API de reflexión de Java para cargar y crear instancias de una clase HelloWorld.class desde el directorio C:\foo\bin:

function classImport() { 
    var location = new java.net.URL('file:/C:/foo/bin/'); 
    var urlArray = java.lang.reflect.Array.newInstance(java.net.URL, 1); 
    urlArray[0] = location; 
    var classLoader = new java.net.URLClassLoader(urlArray); 
    return classLoader.loadClass("HelloWorld"); 
} 

var myClass = classImport(); 

for(var i=0; i<10; i++) { 
    myClass.getConstructor(null).newInstance(null).say(); 
} 

Existen más maneras elegantes de hacer esto, estoy seguro.

+0

Imagine que tengo una aplicación y que no quiero cambiar, todo lo que puedo cambiar es el archivo de script que se carga en la aplicación. Entonces, si quiero hacer algo, no puedo hacerlo en el código de Java de la aplicación, sino solo en el archivo de script, entonces, quiero importar una clase que sea externa a mi proyecto, que se compile y ubique en mi disco duro Espero que sea más explicativo: s mucho –

0

Si te entiendo correctamente, lo que en realidad estás tratando de hacer es cargar clases de Java para que (presumiblemente) puedas crear instancias, etcétera. El término para esto es carga dinámica no importando.

Java le permite cargar dinámicamente archivos de códigos de bytes (*.class) utilizando el método ClassLoader.loadClass(String). Hay muchos recursos sobre este tema; p.ej. la página "Class Loading" del tutorial de JNDI. Esté preparado para dedicar un tiempo a entender este tema. En particular, dado que intenta cargar una clase que no está en el classpath normal de su aplicación, necesitará crear un nuevo cargador de clases para hacer esto. Los Javadocs para la clase java.lang.ClassLoader son here.

El código fuente de Java no se puede cargar directamente, pero primero se debe compilar utilizando un compilador de Java. Si está utilizando una instalación moderna de JDK, es posible llamar al compilador de Java en tiempo de ejecución. Pero una instalación de JRE no incluye un compilador de Java. Si su plataforma tiene un compilador de Java disponible en tiempo de ejecución, puede acceder a él a través del método estático getSystemJavaCompiler() de la clase ToolProvider. Una vez más, llamar al compilador de Java desde una aplicación Java en ejecución es complicado.

+0

Thnx para la respuesta, Lo que quiero hacer es agregar una clase por ejemplo MyClass.java que compilado en MyClass.class así que me gustaría importar MyClass que está en mi disco duro, no en los paquetes de mi proyecto, y esto, dentro de un archivo de script: por ejemplo: importClass ("D: \\ SVN_KC \\ KP \\ trunk \\ Protos \\ ScriptEngine \\ scripts \\ Exemple.class "); –

1

Me pregunto por qué hacer esto.

Las soluciones enumeradas aquí funcionarán. El problema va a ser que:

  1. Usted tendrá un improvisado solución con la reflexión que ser difícil de solucionar.
  2. ¿Están sus clientes bien con código de parche que se carga en Runtime? En todos los lugares en los que he trabajado at is not.
+0

Lo que hay que hacer es permitir que los clientes modifiquen los archivos de script sin tocar la aplicación. Creo que usar la introspección como se dijo en el archivo de script funcionará mucho –

Cuestiones relacionadas