2014-12-21 6 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; 
    } 
} 

Моя проблема заключается в том, как я могу создать объект класса Test в Start классе?
Класс Test должен быть добавлен командной строкой.
В этой программе я должен получить методы от класса Test через объект в классе Start.Инстанцирование класс с отражением

+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 создание своего рода регистра содержащие все команды, могут быть более осмотрительными. –

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