¿Puedo invocar un método java que no sea main (String []) desde la línea de comando?

¿Puedo invocar un método java que no sea main(String[]) desde la línea de comando?

preguntado el 08 de noviembre de 11 a las 17:11

Si instala un REPL para un lenguaje JVM (Groovy probablemente requiere menos trabajo para comenzar), entonces puede invocar métodos Java en el indicador REPL (Groovy se llama groovysh). -

@NathanHughes Ojalá hubieras dejado eso como respuesta. Era exactamente lo que necesitaba. ¿Puedes volver a publicarlo como respuesta? -

@Omnicide: feliz de ayudar :-) -

La idea REPL funciona totalmente: puede usar Beanshell, por ejemplo, para cargar cualquier clase desde cualquier jar y llamar a cualquier método en cualquier clase. Y puede hacerlo simplemente colocando el tarro de beanshell en una máquina y usándolo de forma interactiva o con un archivo de script, que en sí mismo es bastante java. Buen ejemplo simple que muestra cómo hacer esto se puede encontrar aquí -

8 Respuestas

Si no tiene una función principal, puede agregar una, y si la tiene, puede agregar una serie de bloques si-entonces en la parte superior.

public static void main(String[] args){
    if (args[0].equals("MY_METHOD"))
        callMyMethod();
    else if(args[0].equals("MY_OTHER_METHOD"))
        callMyOtherMethod();
    //... Repeat ad nauseum...
    else {
        //Do other main stuff, or print error message
    }
}

Luego, desde la línea de comando:

$ java [MyPackage.]MyClass MY_METHOD

Ejecutará su método.

Esto es bastante hack; estoy casi seguro de que no es lo que quieres hacer, pero bueno, responde a la pregunta, ¿verdad?

respondido 08 nov., 11:22

Tengo curiosidad por saber por qué consideraría esto un truco ... Quiero decir, debe conocer el nombre del método y no es muy escalable. ¿Hace un agujero en la seguridad? - bobanahalf

¿Qué sucede si necesita devolver un valor a la persona que llama? - slashdottir

Si instala un REPL para un lenguaje JVM (Groovy probablemente requiere menos trabajo para comenzar), entonces puede invocar métodos Java en el indicador REPL (Groovy se llama groovysh). groovysh tiene algunas características extrañas (mi parte menos favorita es que declarar variables con def no hace lo que crees que debería) pero sigue siendo realmente útil. Es una característica interesante que Groovy no respeta la privacidad, por lo que puede llamar a métodos privados y verificar el contenido de las variables privadas.

Las instalaciones maravillosas incluyen groovysh. Descargue el archivo zip, extráigalo en algún lugar, agregue la ubicación del directorio bin a la ruta y listo. Puede colocar frascos en la carpeta lib, para el código que está ejecutando y las bibliotecas utilizadas por ese código, y Groovy los encontrará allí.

respondido 12 nov., 12:08

REPL era exactamente lo que necesitaba. Gracias por señalarme. Cambió mi vida. Jajaja. no realmente. - Inverso

Aquí hay una función bash que le permite hacer precisamente eso:

function javae {
  TDIR=`mktemp -d`
  echo "public class Exec { public static void main(String[] args) throws Exception { " $1 "; } }" > $TDIR/Exec.java && javac $TDIR/Exec.java && java -cp $CLASSPATH:$TDIR Exec;
  rm -r $TDIR;
}

Pon eso en ~ / .bashrc y puedes hacer esto:

javae 'System.out.println(5)'

O esto:

javae 'class z { public void run() { System.out.println("hi"); } }; (new z()).run()'

Es un truco, por supuesto, pero funciona.

Respondido 30 Abr '17, 02:04

Interesante ... pero creo que vas a tener dolores de cabeza tratando de lidiar con clases no integradas. - ArtOfWarfare

No puede invocar ni siquiera el método principal desde el comando. La JVM invoca el método principal. Es solo una convención. Siempre debe ser "public static void main".

¿Cuál es tu caso de uso?

respondido 08 nov., 11:21

Desde La especificación de la máquina virtual Java

La máquina virtual Java se inicia creando una clase inicial, que se especifica de manera dependiente de la implementación, utilizando el cargador de clases bootstrap (§5.3.1). La máquina virtual Java luego vincula la clase inicial, la inicializa e invoca su método de clase pública void main (String []). La invocación de este método impulsa todas las ejecuciones posteriores. La ejecución de las instrucciones de la máquina virtual Java que constituyen el método principal puede provocar la vinculación (y, en consecuencia, la creación) de clases e interfaces adicionales, así como la invocación de métodos adicionales.

Así que main parece ser especial.

respondido 08 nov., 11:21

No, no puedes

Según Preguntas frecuentes sobre la línea de comandos de Java (que está muerto ahora). Puedes comprobar Preguntas frecuentes sobre subprocesos de Java

El método de punto de entrada main () se utiliza para proporcionar una convención estándar para iniciar programas Java. La elección del nombre del método es algo arbitraria, pero está diseñada en parte para evitar conflictos con los métodos Thread start () y Runnable run (), por ejemplo.

Consulte las preguntas frecuentes. Obtendrá un buen conocimiento sobre la línea de comandos de JAVA

Respondido el 23 de enero de 18 a las 16:01

el enlace de preguntas frecuentes está muerto :( - John Meyer

Gracias por actualizar tu publicación. Desafortunadamente, este segundo enlace puede requerir la compra de un libro. "Ha llegado a una página que no está disponible o ha alcanzado el límite de visualización de este libro". - John Meyer

No, no lo creo. main () es el punto de entrada. Eso está definido por el idioma. Puede ajustar un script alrededor de la llamada main () ("java MyApp arg1 ... argn"), por supuesto, para ocultar el nombre (e incluso ocultar que está usando Java) y proporcionar su propia sintaxis y análisis de parámetros. - esa es una capacidad proporcionada por el sistema operativo, por supuesto, a través de algún tipo de lenguaje de secuencias de comandos de línea de comandos.

Si usa Java para crear otros tipos de ejecutables, como Applets o aplicaciones GWT, entonces el punto de entrada es diferente, pero creo que está pensando específicamente en los ejecutables que se ejecutan desde la línea de comandos.

respondido 08 nov., 11:21

No, eso no es posible.

Consulte la especificación del lenguaje Java

http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html

Por supuesto, los applets y servlets y otras tecnologías pueden tener diferentes puntos de partida.

respondido 05 nov., 18:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.