クラスのコードを含む文字列を持つクラスを動的に作成する方法はありますか、以前に作成した既存のクラスと同じ方法でメソッドを追加する方法はありますか?動的クラスの作成 - Java
ユースケースシナリオ:学生はIDEなしでいくつかの方法を書かなければならない試験をしています(単純な文字列を送信します)。私が達成したいのは、彼の提出について簡単なユニットテストを実行する方法です。例えば、教授が提供するユニットテストを実行するためのクリック可能なボタン。
私の悪い英語とおかげで申し訳ありません!
クラスのコードを含む文字列を持つクラスを動的に作成する方法はありますか、以前に作成した既存のクラスと同じ方法でメソッドを追加する方法はありますか?動的クラスの作成 - Java
ユースケースシナリオ:学生はIDEなしでいくつかの方法を書かなければならない試験をしています(単純な文字列を送信します)。私が達成したいのは、彼の提出について簡単なユニットテストを実行する方法です。例えば、教授が提供するユニットテストを実行するためのクリック可能なボタン。
私の悪い英語とおかげで申し訳ありません!
学生は、バイトコードではなく、Javaソースコードを提出します。 Javaソースコードは、Javaコンパイラを使用してバイトコードにコンパイルしてから、クラスローダによってロードする必要があります。プログラムでコンパイラを呼び出すことでこれを行うことができます(this回答を参照)。
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
(hereからたとえば、感謝@Robert):実行時にこの新しい.class
ファイルのロードバイトコードは次のように行うことができます。
インスタンスを取得したら、テストアプリケーションにフィードを送ってテストを実行し、結果を得ることができます。
送信されたクラスに定義したインターフェースを実装し、そのインターフェースに対してテストコードテストを行うのが最も簡単です。このようにして、テストは事前にコンパイルされ、実行時に動的にコンパイルされた&インスタンス化されたサブミットを処理できます。
実行時に標準クラスローダーと 'loadClass'を介して動的に生成されたクラスをロードすることは、IMHOは良い解決策ではありません。バイトコードデータから直接クラスを作成するカスタムClassLoaderが優れています。 JavaDocの["NetworkClassLoader"の例](https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html)を参照してください。 – Robert
新しいクラスが作成されないため、正しいと思いますクラスパス上にある。それを十分に長く考えなかった.-D –
生徒は.txtファイルを手渡しますか?なぜ、.javaファイルではないのですか?それはプロジェクトに簡単に追加できるので、そのような奇妙な問題はありません。 –
生徒は、 "Submit"と "run tests"の2つのボタンが付いたテキストボックスが彼の前にあります。このテキストボックスでは、彼はクラスコードを持っており、2つまたは3つのメソッドを追加して編集する必要があります。彼が "テストを実行する"ボタンをクリックすると、すべてのクラスコードをStringに入れたり、指定された名前*でこの文字列からクラスを動的に作成するような魔法のようなものを想像したり、コードからjunitテストを実行したり、彼。 – giku93113
@TobiasBrösamle 'the project'?どのプロジェクトを参考にしていますか? OPには、IDEなしでテキストとして提出されたソースコードの自動単位テストが必要です。 –