2013-03-23 82 views
3

當使用反射調用Java類從另一個主要方法的主要方法,如何在Java中使用反射調用類的main()方法

Class thisClass = loader.loadClass(packClassName); 
Method thisMethod = thisClass.getDeclaredMethod("main",String[].class); 

thisMethod.invoke(null, new String[0]); 

我應該創建的newInstance()或直接撥打主(),因爲它是靜態的。

+0

是否有構造函數需要參數類型String []? – RedSoxFan

+0

'main'方法是靜態的嗎?如果是這樣,你爲什麼要創建一個類的實例?如果不是,那麼對'invoke'的調用是錯誤的。 –

+1

實際上,當我調用非參數化方法時,它可以正常工作,但它在參數化方法中不能正常工作......爲什麼這樣呢? –

回答

7

對於你們所要求的(動態調用一個隨機類的主要方法,以反映你有很多不必要的代碼。

  • 你不需要調用構造函數的類
  • 你做並不需要反思的類字段
  • 既然你調用一個靜態方法,你甚至不需要真正的對象調用的方法上

您可以廣告以下代碼來滿足您的需求:

try { 
    final Class<?> clazz = Class.forName("blue.RandomClass"); 
    final Method method = clazz.getMethod("main", String[].class); 

    final Object[] args = new Object[1]; 
    args[0] = new String[] { "1", "2"}; 
    method.invoke(null, args); 
} catch (final Exception e) { 
    e.printStackTrace(); 
} 
1

知覺答案看起來正確;如果你需要從Jar中加載不在類路徑中,你可以使用URL類加載器

 try { 
     URL[] urls; 
     URLClassLoader urlLoader; 

     urls = ...; 

     urlLoader = new URLClassLoader(urls); 

     @SuppressWarnings("rawtypes") 
     Class runClass = urlLoader.loadClass(classToRun); 

     Object[] arguments = new Object[]{args}; 
     Method mainMethod = runClass.getMethod("main", String[].class); 
     mainMethod.invoke(null, arguments); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     }