3

我想在java中使用反射,我想做第三个类将从控制台读取类的名称作为字符串。读取类的名称后,它将自动动态地(!)生成该类并调用其writeout方法。如果没有从输入中读取该类,则不会对其进行初始化。

我写了那些代码,但我总是接受“ 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());    
          }    
    }    
}
4

2 回答 2

6

ClassNotFoundException当您尝试反映一个类名并且具有该名称的类不能位于类路径中时,Java 将抛出一个。您应该确保您尝试实例化的类在类路径中,并且您使用它的完全限定名称(例如:java.lang.String而不是只是String

编辑:您不需要forNameClass. 相反,请使用 1 参数forName,它只接受您传入的类名。

于 2010-04-02T13:09:57.427 回答
4

尝试通过反射实例化对象时的一个常见错误是只传递类名,而不是完全限定名。换句话说,使用“String”而不是“java.lang.String”是行不通的。

另外,请注意,您的代码仅适用于具有默认(或无 arg)构造函数的类。如果您遇到一个在其构造函数中需要参数的类,您对“cls.newInstance()”的调用将失败。

于 2010-04-02T13:18:15.240 回答