2014-12-21 63 views
-2
class Start 
{ 
    public static void main(String[] argv) 
    { 
     int argc =argv.length; 
     if (argc == 0) { 
      System.err.println("error"); 
      return; 
     } 

     try 
     { 
      Class<?> c = Class.forName(argv[argv.length-1]); 
      //c kowalski = c.newInstance(); 
     } 
     catch (Exception e) { System.out.println(e) ; return; } 
    } 
} 
class Test implements InfoInterface 
{ 
    public void display() 
    { 
     System.out.println("HI!");  
    } 
    static int w; 
    public int dodawanie (int a, int b) 
    { 
     w=a+b; 
     return w; 
    } 
} 

我的問題是我怎麼能在Start類中創建Test類的對象?
Test類必須通過命令行添加。
在這個程序中,我必須通過Start類中的對象從Test類中獲取方法。一個類實例化與反思

+4

剛纔調用'c.newInstance()'有什麼問題? – Mureinik

+1

這並不完全清楚你想要什麼。如果你想要這些方法的名字,你可以從'''Class'對象中得到它們,你稱之爲'c'。或者你想實際*調用方法? – RealSkeptic

+0

可能重複[在Java中創建一個變量的新類](http://stackoverflow.com/questions/1268817/create-new-class-from-a-variable-in-java) – Joe

回答

2

您可以在從命令行執行程序時,通過在參數中傳遞具有完整類路徑的類的名稱來創建動態對象。

0

您可以通過執行獲得一個新的類實例:

Class<?> c = Class.forName(argv[argv.length-1]); 
Test t = (Test) c.newInstance(); 

,或者,如果你有更多的InfoInterface實現:

Class<?> c = Class.forName(argv[argv.length-1]); 
if (!InfoInterface.class.isAssignableFrom(c)) { 
    throw new Exception("Invalid interface specified"); 
} 
Class<InfoInterface> iic = (Class<InfoInterface>) c; 
InfoInterface ii = iic.newInstance(); 

當心您指定類的全名(包括包名稱)

Class<?> c = Class.forName(argv[argv.length-1]); 

一行。你當然也可以自己添加字符串包:

String command = argv[argv.length-1]; 
Package p = InfoInterface.class.getPackage(); 
if (p != null) { 
    command = p.getName() + "." + command; 
} 
Class<?> c = Class.forName(command); 

假設Test等命令在同一個包InfoInterface

+0

PS創建某種寄存器包含所有命令可能會更審慎。 –