2014-11-23 2 views
0

Я объявил интерфейс вроде следующегополиморфизм и создание объекта с помощью строки

public interface One { 
    void setNo(int no); 
} 

Тогда у меня есть класс для реализации интерфейса

public class Two implements One{ 
    private int no; 

    @Override 
    public void setNo(int no){ 
     this.no = no; 
    } 
} 

у меня будет много классов для реализации интерфейс, а затем я хочу создать соответствующий объект в соответствии с пользовательским вводом.

Предположим, у нас есть классы Three, Four, Five, описанные как класс Two.

Пользователь выбирает для создания класса Три. Поэтому я пытаюсь сделать что-то вроде

One base; 

Class c = Class.forName("Three"); 
base = (One) c.newInstance(); 

base.setNo(5); 

звонок на base.setNo() не работает. Правильно ли я это делаю?

Ошибка

java.lang.ClassNotFoundException: Three 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:260) 
    at com.company.Main.main(Main.java:33) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
+0

Что ошибка? и ваш код выше даже компиляции? – SMA

+1

Попробуйте использовать полное имя класса – Eran

+0

Кроме того, если код из трех аналогичен коду Two, 'setNo' является закрытым пакетом, что означает, что вы не можете получить к нему доступ из класса, который не находится в одном пакете. – Eran

ответ

2

Включить имя пакета так что если ваш класс Три в пакете com.test, то вы должны написать этот путь

Class c = Class.forName("com.test.Three"); 
    base = (One) c.newInstance(); 

    base.setNo(5); 
+0

Это сработало, но почему? – kechapito

+1

хорошо, потому что для метода forName требуется полное имя класса, например, есть два класса/файлы с тем же именем «Список» (java.awt и java.utils), как вы думаете, метод forName будет отличать их без имени пакета ? – Vilen

1

Он должен дать ошибку компиляции:

Не удается уменьшить видимость унаследованного метода из одного

Try сделать метод общедоступными.

public class Two implements One{ 
    private int no; 

    @Override 
    public void setNo(int no){ 
     this.no = no; 
    } 
} 

Я не знаю, где вы созданы Три класса, но я могу помочь с вашим двумя классами.

public class Two implements One { 
    private int no; 

     @Override 
     public void setNo(int no){ 
      this.no = no; 
      System.out.println("No-->"); 
     } 
     public static void main(String[] args) { 
      One base; 

      Class c; 
      try { 
       c = Class.forName("com.test.stackoverflow.Two"); 
       base = (One) c.newInstance(); 
       base.setNo(5); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InstantiationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

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