しかし、外部 jar ファイルをプロジェクトに追加すると、Java ファイルが src に配置されません。私は何をしますか?
1 に答える
Jar ファイルは通常、Java クラスのコンパイル済み形式です。ソースは jar に含めることができますが、めったに含まれません。したがって、予期される「.java」ファイルの代わりに、コードのコンパイル済み形式である「.class」ファイルが表示されます。ファイルを編集する場合は、いくつかのオプションがあります
他の場所でソースを探してください
これは本当にあなたの最善の策です。オープン ソース プロジェクトの場合は、そのソースを探します。おそらく、かなり簡単にグーグルで検索するか、検索エンジンでこのようなmavenリポジトリを検索できます。たとえば、ここに表示されている場合、junit を探したところ、「sources.jar」というエントリが見つかりました。
それがオープンソース プロジェクトではなく、あなたの仕事の内部プロジェクトである場合、そのプロジェクトを担当するチームが存在する可能性があります。元のソースを最初にコンパイルされたとおりに入手することが本当に最善の選択であるため、彼らに連絡してください。
しかし、ソース コードに絶対にアクセスできない場合はどうでしょうか。では、選択肢は 2 つあります。これらのオプションは、Java に精通している場合にのみお勧めします。これらのオプションは、解決できるよりも多くの問題を引き起こす可能性があるためです。
クラスの拡張とメソッドの置き換え
これを行う理由は、クラスの1つの動作のごく一部を編集し、その変更されたクラスを、コードにアクセスできるプロジェクトで使用するためだと思います。拡張するクラスがfinalではないこと。この場合、クラスを拡張してサブクラスを作成し、変更したい小さな機能を制御するメソッドをオーバーライドできます。
これは、注意を怠ると非常に危険な考えになる可能性があります。その理由は、コードにアクセスできない場合、実装の詳細がどのように機能するかを確実に知ることができないからです。これはエラーにつながる可能性があります。元のコードへの可視性の欠如は、
- クラスの元の機能が壊れるような方法でメソッドをオーバーライドする。これは、上書きしたメソッドが特定の内部アクションを行っていた可能性があるために発生する可能性があります。
- 元のクラスには、新しいクラスがアクセスできない非パブリックまたは非保護のフィールドとメソッドが存在する場合があります。そのため、機能を目的の機能に完全に置き換えることができない場合があります。
では、これが最善のアイデアではないかもしれないすべての理由があなたを悩ませているとしたらどうでしょうか? クラスの機能を直接置き換える方法がもう 1 つあります。
プロジェクトの逆コンパイル
「.class」ファイルを受け取り、それを「.java」ファイルに変換する利用可能な Java デコンパイラーは多数あり、一部は eclipse と統合されています。ただし、これには元のソースの取得に比べて深刻な欠点があります
- 合法ではないかもしれません。あなたが持っているjarがライセンスによって提供されている場合、そのjarをダウンロードして使用する前に同意したライセンス契約に違反する可能性が非常に高いです.
- コードが読みにくくなります。ソース コードに元々含まれていた優れた命名規則のほとんどが失われ、コードが非常に読みにくくなります。
逆コンパイルと再コンパイルは、その価値よりも多くのバグに非常に簡単につながる可能性があります。十分に使用できますが、可能であれば近づかないことをお勧めします。
それで、あなたは何をすべきですか?
構成、再実装なし
私は今、あなたが望んでいることのほとんどを行うクラス(またはクラスのリスト)を提供するjarを持っていると思いますが、正確ではありません。元のソース (アクセスできないようです) を変更する代わりに、そのクラスを使用して、最終的なコンポーネントを希望するものに変更するメソッドを作成します。これを行うには、目的のクラスをフィールドとして含むクラスを作成し、それを変更します。たとえば、EuropeanCar という名前のクラスの jar ファイルが気に入っているが、代わりに AmericanCar を使用したいとします。唯一の違いは、EuropeanCar の "Kilometers" ではなく、"Miles per hour" でアメリカの車が現在の速度を返すことです。 1時間当たり"。ただし、この例では、他のすべての機能は 100% 同じです。
次のようなものがあります。
public class AmericanCar
{
//...
private EuropeanCar internalEuropeanCar;
//...
public double getCurrentSpeed()
{
return AmericanCar.convertKilometerToMiles(this.internalEuropeanCar.getCurrentSpeed());
}
private static double convertKilometerToMiles(double currentSpeed)
{
// ...
return CONVESION_VALUES;
}
//...
}
もちろん、これは非常に単純化された例ですが、コンポーネントを使用するという考え方であり、これらのコンポーネントは、プログラムで使用するために jar で提供されるタイプにすることができます。これは、元のソース コードにアクセスできない場合に問題を解決する最もクリーンなソリューションです。また、アクセスできる場合でも、変更内容によっては、より適切な選択となる可能性があります。