我宣佈類似下面的多態性與對象的創建使用字符串
public interface One {
void setNo(int no);
}
的接口,那麼我有一個類實現該接口
public class Two implements One{
private int no;
@Override
public void setNo(int no){
this.no = no;
}
}
我將有很多的類來實現的接口,然後我想根據用戶輸入創建相應的對象。
假設我們將三,四,五類描述爲兩類。
用戶選擇創建三類。所以我嘗試做下面的事情
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)
有什麼錯誤?上面的代碼是甚至編譯的? – SMA 2014-11-23 13:38:27
嘗試使用完全限定的類名稱 – Eran 2014-11-23 13:39:56
另外,如果Three的代碼類似於Two,'setNo'是封裝私有的,這意味着您無法從不在同一個包中的類訪問它。 – Eran 2014-11-23 13:42:07