2017-02-28 3 views
1

実行時に別のクラスを読み込み、それをインスタンス化してそのメソッドを実行してメソッドを実行し、 。Javaでコンパイルされたクラスを読み込み、ファイルからそのインスタンスを逆シリアル化する

私はあなたがJavaでメソッドをシリアル化することはできませんので、私はproject2にクラスのインスタンスをシリアル化することを考えている、project1ClassLoaderでコンパイルされたクラスをロードし、それをインスタンス化し、project1porject2から非直列化されたインスタンスを割り当てて、気づいたものから、インスタンス化されたロードされたクラスに渡します。

シリアル化されたクラスは、両方のプロジェクトで同じ親クラスを継承します。

これは最善の方法ですか?それは私のアプリがコードを変更せずに他のタイプのクラスを受け入れることができるという要件です。

TL:私の計画では、私のプロジェクトがそのクラス(特に内部のメソッド)を知っているように、コンパイルされたクラスをClassLoaderでロードし、そのシリアル化されたクラスインスタンスをプロジェクト内にロードして、インスタンスからロードされたクラスと一緒に(今私もメソッドを知っている)、デシリアライズされたインスタンスでメソッドを実行します。

+0

ありがとうございます。感謝の気持ちを表明しました;-) – GhostCat

答えて

2

あなたは間違っています。あるオブジェクトのメソッドを呼び出す機能は、シリアル化にはすべてとは関係ありません。

私の意味:メソッドの実装はではなく、のシリアル化されたデータの一部です! Javaのシリアル化は、フィールドのデータのみを出力ストリームに書き込みます。方法

実装いくつかのJavaクラスのクラスファイルに依存します。オブジェクトを直列化および逆シリアル化することはできますが、そのようなオブジェクトのメソッドを呼び出すと、が対応するクラスローダによってロードされたクラスファイルによって決定されます。最初ににアクセスします。クラス。

あなたの目標が本当に「1つのクラスがオブジェクトをバイナリ表現にダンプする」場合は、もう1つのコードがバイナリデータをロードします。それをオブジェクトに変換します。そのオブジェクトにアクセスする。 ではなく、に2つのプロジェクトが必要です。また、「方法がある」ことについても心配する必要はありません。あなたのClassLoader が、デシリアライズされるべきオブジェクトのクラスを知っている限り、すべてがうまくいくでしょう。このhereのようなサンプルチュートリアルを選択して作業してください。

しかし:あなたの条件方法や任意オブジェクトのアクセスフィールドを呼び出すことです。シリアライゼーションを調べるのではなく、Java reflectionに入ります。

しかし、そこには警告があります。反射は簡単ですが、安心してください。間違ったコードを書き込む方法はたくさんあります。反射は基本的にランタイムのものなので、Javaコンパイラはあまり役に立ちません。あなたは合理的に見えるコードを書いてコンパイルし、実行し、例外を得ることができます。

この意味で、Javaのカリキュラムではアドバンスアドバンスです。むしろ後退して、あなたの教師と正確に何を期待しているのかを明確にする必要があると思います。

最新のアップデートがある場合:シリアライズについてのチュートリアルを参照してください(反射部分については忘れてください)。あなたの質問に答えるために:はい、それは実行可能なアプローチのように聞こえます。もっと言えません。これまでコードを共有していないためです。

+0

こんにちは。私の計画はClassLoaderでコンパイルされたクラスをロードして、私のプロジェクトがそのクラス(特に内部のメソッド)を知っていることを確認してから、そのインスタンスを直列化したクラスインスタンスをプロジェクトの中にロードして、クラス(今私はメソッドも知っています)、デシリアライズされたインスタンスでメソッドを実行します。私は私の質問を編集した、私は "別のクラスをロードし、そのインスタンスの一つを非直列化する"と言ったかった –

+0

私の更新を見ます。しかし、われわれは具体的な問題を手助けしている。そしてその意味では、あなたの要求は実際にはあまりにも非特異的である。 – GhostCat

関連する問題