2013-05-28 2 views
0

У меня есть объект, как этотЗапуск основной метод от объекта с типом «Класс <?>»

Class<?> myClass = getMyClass(); 
// don't ask about getMyClass() method, it's not important, 
just be sure that this method returns a class. 

Во-вторых, я уверен, что «MyClass» содержит «основные (арг String [])» метод.

Как запустить этот основной метод. Думаю, я должен использовать java.lang.reflect, но я не знаю, как это сделать.

Все, что я хочу, это что-то вроде этого.

String params[] = {"arg1", "arg2"}; 
cl.main(params); 
+0

В чем проблема? Я вижу только сделку :) – Ashish

+2

@Ashish Я нашел вопрос довольно ясным: как использовать отражение, чтобы вызвать основной метод для класса. – Vulcan

ответ

3

Из Java tutorial on the reflection API:

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.Arrays; 

public class InvokeMain { 
    public static void main(String... args) { 
    try { 
     Class<?> c = Class.forName(args[0]); 
     Class[] argTypes = new Class[] { String[].class }; 
     Method main = c.getDeclaredMethod("main", argTypes); 
     String[] mainArgs = Arrays.copyOfRange(args, 1, args.length); 
     System.out.format("invoking %s.main()%n", c.getName()); 
     main.invoke(null, (Object)mainArgs); 

     // production code should handle these exceptions more gracefully 
    } catch (ClassNotFoundException x) { 
     x.printStackTrace(); 
    } catch (NoSuchMethodException x) { 
     x.printStackTrace(); 
    } catch (IllegalAccessException x) { 
     x.printStackTrace(); 
    } catch (InvocationTargetException x) { 
     x.printStackTrace(); 
    } 
    } 
} 
+0

Спасибо :) Это работает –

3

Да, вы можете использовать отражение.

myClass.getDeclaredMethod("main", String[].class).invoke(null, (Object)args); 
+0

A * downvote *? С какой стати? Чистый, простой, правильный ответ. –

+0

Я рассматриваю исключения, которые не позволяют работать с кодом, и я также использовал комментарий. Теперь downvote был удален, и вы исправили свой ответ. Я не вижу указанной ошибки в ответе Pshemo, которая является такой же, как ваша, за исключением использования 'getMethod' вместо' getDeclaredMethod', что является подходящей альтернативой в предположении, что основной метод является общедоступным, так как это должно быть в порядке быть действительным основным методом. – Vulcan

+0

@MarkoTopolnik, ваше решение работает, действительно, спасибо. Я просто предпочел проголосовать за ответ Тедда Хоппа, потому что он исходит от Javadoc –

0

Получить ссылку на основной метод (myClass.getDeclaredMethod), а затем вызвать метод (Method.invoke). Детали должны быть очевидны, если вы посмотрите на javadocs методов.

3

Это должно сделать трюк
(я предполагаю, что main 1) государственные (танки к этому getMethod будет работать) и 2) static, поэтому я прохожу null в качестве первого параметра в invoke)

myClass.getMethod("main", String[].class).invoke(null, (Object) params); 
+0

Почему вы бросаете 'params' в' Object'? – Vulcan

+1

@ Vulcan Поскольку 'invoke' использует varargs как второй аргумент' invoke (Object obj, Object ... args) '. Это сделает массив как один параметр (как и ожидалось в 'main (String [] args)', а не в массиве параметров. – Pshemo

+0

Отличный улов, это делает ваш ответ единственным правильным. Теперь я удаляю свой ответ. – Vulcan

Смежные вопросы