2010-04-02 28 views
3

我想在java中使用反射,我想這樣做,第三類將從控制檯讀取類的名稱作爲字符串。在閱讀課程名稱後,它會自動動態地(!)生成該課程,並調用其方法writeout。如果該類不是從輸入中讀取的,則不會被初始化。使用Java動態創建類反射,java.lang.ClassNotFoundException

我寫的代碼,但我總是採取「java.lang.ClassNotFoundException」,我不知道如何解決它。 任何人都可以幫助我嗎?

class class3 { 
    public Object dynamicsinif(String className, String fieldName, String value) throws Exception 
    {  
     Class cls = Class.forName(className,true,null);  
     Object obj = cls.newInstance();  
     Field fld = cls.getField(fieldName);  
     fld.set(obj, value);  
     return obj;  
    } 

    public void writeout3()  
    {  
     System.out.println("class3");  
    }  
} 

public class Main {   
    public static void main(String[] args) throws Exception  
    {    
      System.out.println("enter the class name : ");  
     BufferedReader reader= new BufferedReader(new InputStreamReader(System.in)); 
      String line=reader.readLine();  
      String x="Text1";  
      try{  
       class3 trycls=new class3();  
       Object gelen=trycls.dynamicsinif(line, x, "rubby");  
       Class yeni=(Class)gelen;   
       System.out.println(yeni);      
      }catch(ClassNotFoundException ex){   
       System.out.print(ex.toString());  
      }  
    }  
} 
+0

縮進你用4個空格編碼,並刪除空行,使其更容易閱讀 – Progman 2010-04-02 13:06:40

+1

正在使用「我」字符來引用「我」一個國際化的事情? – 2010-04-02 13:12:10

回答

6

Java將拋出一個當您試圖反映一個類名和這個名字不能被定位在的類路徑ClassNotFoundException。您應該確保你正在試圖將類實例是在類路徑上和您使用它的完全限定域名(例如:java.lang.String,而不是僅僅String

編輯:你不需要在使用3精氨酸forName方法Class。相反,請使用只傳遞您傳入的類名的1 arg forName

4

嘗試通過反射實例化對象時常見的錯誤是僅傳遞類名稱,而不傳遞完全限定名稱。換句話說,使用「String」而不是「java.lang.String」將不起作用。

另外,請注意,您的代碼只適用於具有默認(或不含arg)構造函數的類。如果遇到需要參數構造函數的類,則調用「cls.newInstance()」將會出現barf。