3

Javaでリフレクションを使用したいのですが、3番目のクラスがクラスの名前をコンソールから文字列として読み取るようにしたいと考えています。クラスの名前を読み取ると、自動的かつ動的に (!) そのクラスを生成し、その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

クラス名を反映しようとすると、Java は をスローし、ClassNotFoundExceptionその名前のクラスはクラスパスに配置できません。インスタンス化しようとしているクラスがクラスパス上にあり、その完全修飾名を使用していることを確認する必要があります (例:java.lang.Stringの代わりにString)

forName編集: で 3 argメソッドを使用する必要はありませんClassforName代わりに、渡すクラス名のみを受け取る 1 つの引数を使用してください。

于 2010-04-02T13:09:57.427 に答える
4

リフレクションを通じてオブジェクトをインスタンス化しようとするときによくある間違いは、完全修飾名ではなく、クラス名だけを渡すことです。つまり、「java.lang.String」の代わりに「String」を使用しても機能しません。

また、コードはデフォルトの (または引数のない) コンストラクターを持つクラスに対してのみ機能することに注意してください。コンストラクターで引数を必要とするクラスに遭遇した場合、"cls.newInstance()" への呼び出しは barf になります。

于 2010-04-02T13:18:15.240 に答える