-2

入力に基づいてJavaプログラムを動的にロードする必要があるという要件があります。すべてのJavaクラスファイルは、C:// Users / me / worksheet / File / bin /Encrypt/フォルダーに配置されます。このフォルダには、Class1.class、Class2.class、Class3.classの3つのクラスファイルがあります。

実行時にそれらを取得するために、私は以下のコードを使用しています:

  package First;

  import java.io.File;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.net.URLClassLoader;

  public class Main 
  {

public static void main(String[] args) {

            // Say Class.class is the input file to be picked up.
    String abc = "Class1.class";    

   try { 
  File file = new File("C:\\Users\\me\\workspace\\File\\bin\\Encrypt"); 

    //convert the file to URL format
    URL url = file.toURI().toURL(); 
    URL[] urls = new URL[]{url}; 

       //load this folder into Class loader
    ClassLoader cl = new URLClassLoader(urls); 
    Class  cls = cl.loadClass(abc);

    System.out.println("cls.getName() = " + cls.getName());

    cls.encrypt();              

            } 
        catch ( ClassNotFoundException | MalformedURLException e) {
            e.printStackTrace();
            }
}
   }

私はここで以下の問題に直面しています:

  1. 上記のコードはエラーを示しています:.NoClassDefFoundError:Class1 ?? パスですべてのタイプの-/、\、//、\を使用しました。
  2. Class1ファイルでメソッドsum()を呼び出すにはどうすればよいですか?
4

1 に答える 1

0

あなたが持っている...\bin\Encryptのはあなたのクラスがあるフォルダなので、あなたのクラスのパッケージはに違いないでしょうEncrypt。この場合abc

String abc = "Enrcypt.Class1";

クラスがデフォルトパッケージにある場合、つまり、使用するよりもパッケージ宣言がない場合

String abc = "Class1";

.classクラス名に拡張子を付ける必要がないことにも注意してください。

この方法でロードされたクラスのメソッドを呼び出すには、javarefelctionapiを参照する必要があります。

まず、getMethodを使用してクラスからMethodオブジェクトを取得します cl

そのメソッドオブジェクトのメソッドinvokeを使用して関数を呼び出すよりも。呼び出すメソッドが静的でない場合は動的にロードされるクラスのインスタンスを提供する必要があります。静的な場合はnullを渡すだけです。

于 2013-03-03T12:14:55.537 に答える