2017-02-08 22 views
1

クライアントのインターフェイスを持っていても実装されていないクラスのオブジェクトをサーバーからクライアントに送信しようとしています。クライアントが実行時にコンパイルするクラス。 、実行時にJavaファイルをコンパイルしてClassNotFoundExceptionを使用してください。

  • Class.javaそれをコンパイル
  • クライアントに送信 Class.classファイル
  • は、クライアント

にオブジェクトを送信し、私ものコンパイルかかわらず、ここClassNotFoundExceptionを得たのだ。私は、これまで得たことです私はちょうどうまく動作するファイルを送信します。誰もが、自分自身の1つとして、新しくコンパイルされたクラスを受け入れるためにファイルをコンパイルした後に何をしなければならないのですか?

はコード

// sending file over via socket and saved it as Class.java 
String fileName = "C:\\Users\\A\\workspace\\Project\\src\\Class.java"; 
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
int result = compiler.run(null, null, null, fileName); 
if(result == 0) { 
    System.out.println("compiler success"); // just to check if the compiler is fine 
} 

URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("C:\\Users\\A\\workspace\\Project\\src").toURI().toURL()}); 
Class<?> loadedClass = classLoader.loadClass("Class"); 

ObjectInputStream is = new ObjectInputStream(socket.getInputStream()); 
Object returnObj = loadedClass.cast(is.readObject()); // got ERROR: Exception in thread "main" java.lang.ClassNotFoundException: Class 
+0

これはjava.lang.Classと競合する可能性があります。パッケージを使用し、デフォルトのパッケージにクラスを入れないでください。 – Patrick

+0

@パトリック私はそれをComputeClassに変更してパッケージを設定しますが、それと同じエラーです。しかし、パッケージのリマインダのおかげで、私は長い間Javaをやりません。 – Megazero

答えて

0

についてあなたのClassLoaderオブジェクトをデシリアライズするときに使用する必要があります。現在、ObjectInputStreamはシステムクラスローダを使用していますが、そのクラスパスにはClassがありません。

クラスローダーをコンテキストクラスローダとして設定すると便利です。

クラス名を変更してパッケージを使用してください。これらの操作の多くをカプセル化したRMIClassLoaderも調査する必要があります。

+0

'Thread.currentThread()。setContextClassLoader(classLoader);' 'ObjectInputStream is = new ...'を実行する前にコンテキストクラスローダを設定できます。右?それでも私は同じ 'ClassNotFoundException'エラーを返します。 – Megazero

+0

次に、クラスローダによってロードされるクラスでデシリアライゼーションコードを実行する必要があります。 – EJP

+0

私は私の問題を把握し、Eclipseを使用してクライアントを実行するため、すべてのソースコード.classファイルが/ binフォルダにコンパイルされ、実行時に実行されるcompile.runコードはソースと同じフォルダコード(/ src)であるため、実行時にコンパイルされるクラスファイルも/ srcにあり、/ binではなく他の.classファイルであるため、動作しません。単純に/ binにフォルダを変更するファイルの名前を変更するだけで正常に動作します。しかし、ちょっとコードを細かくするために、compiler.runコードが/ binフォルダに直接コンパイルされた.classファイルを置くように指定する方法がありますか? – Megazero

関連する問題