2012-01-28 16 views
10

Sillamada dado un objeto de clase en Java

class MyClass { 
    public static void main(String[] str) { 
     System.out.println("hello world"); 
    } 
} 

// in some other file and method 
Class klass = Class.forName("MyClass"); 

¿Cómo puedo llamar MyClass.main? No tengo la cadena "MyClass" en el momento de la compilación, así que no puedo simplemente llamar al MyClass.main(String[]{}).

+0

La carga de reflexión y clase puede hacer esto. ¿Puedes decirnos la motivación detrás de esto? –

Respuesta

29

Utiliza reflection para invocar métodos (o crear objetos, etc.). A continuación se muestra un ejemplo para invocar el método main() en MyClass. Todo lo que necesita para asegurarse es que MyClass está en el classpath.

Class<?> cls = Class.forName("MyClass"); 
Method m = cls.getMethod("main", String[].class); 
String[] params = null; 
m.invoke(null, (Object) params); 
+8

NO llamaría a un método de punto de entrada 'main' y le pasaría un argumento' null'. El lanzador 'java' llama' main' con una matriz vacía si no hay argumentos de línea de comandos, y la mayoría de los métodos 'main' no se molestan en verificar' null'. –

+0

@StephenC gracias por la información sobre el iniciador de Java. No lo sabía. –

-6

Si usted no tiene los "MyClass" cadena en tiempo de compilación, entonces de alguna manera tenga que mirar hacia arriba, las formas más comunes que los marcos de uso para hacer esto:

  • configurar una o .properties archivo xml donde encontrará el nombre de clase que necesita.
  • escanee el directorio actual para archivos .class que coincidan con sus criterios.
  • escanear archivos .jar para archivos .class que coincidan con sus criterios.
+0

No. Lo siento, no sabes lo que estoy haciendo --- no hay absolutamente ninguna forma de obtener la cadena MyClass en tiempo de compilación. –

+0

Eso es * preciselly * lo que estoy recomendando, necesita depender de otra fuente de información (como un archivo xml) donde está configurada la cadena MyClass, o necesita escanear los archivos de la clase (digamos cada clase con un main estático método) en RUNTIME. –

+0

Oh, entonces malinterpretaste mi pregunta. No se trata de obtener la cadena, se trata de llamar a un método estático en la clase cuyo nombre coincide con la cadena. –

Cuestiones relacionadas