我想在java中使用反射,我想做第三类将从控制台读取类的名称作为String。在读取类的名称后,它将自动动态地(!)生成该类并调用其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());
}
}
}
答案 0 :(得分:6)
当您尝试反映类名时,Java将抛出ClassNotFoundException
,并且具有该名称的类不能位于类路径中。您应确保您尝试实例化的类位于类路径上并且您使用其完全限定名称(例如:java.lang.String
而不仅仅是String
)
编辑:您不需要在forName
上使用3参数Class
方法。相反,请使用仅包含您传入的类名的1个arg forName
。
答案 1 :(得分:4)
尝试通过反射实例化对象时常见的错误是只传递类名,而不传递完全限定名。换句话说,使用“String”而不是“java.lang.String”将不起作用。
另外,请注意,您的代码仅适用于具有默认(或无arg)构造函数的类。如果你遇到一个在它的构造函数中需要参数的类,你对“cls.newInstance()”的调用将是barf。