Javaのパッケージ内から、指定されたパッケージ内にないファイルにアクセスする方法を検索してみましたが、答えが見つかりませんでした。誰かが方法を知っていますか?
3 に答える
名前付きパッケージからデフォルト (名前なし) パッケージの CLASS にアクセスしたい場合は、アクセスできません。JLS は次のように述べています。
「名前のないパッケージ (§7.4.2) の型には正規名がないため、あらゆる種類のインポート宣言での正規名の要件は、(a) 名前のないパッケージの型をインポートできないこと、および (b) 静的であることを意味します。名前のないパッケージ内の型のメンバーはインポートできません. そのため、§7.5.1、§7.5.2、§7.5.3、および §7.5.4 はすべて、型をインポートしようとするとコンパイル時エラーが必要です (またはその静的メンバー) を名前のないパッケージに入れます。"
つまり、単一タイプのインポートは使用できません。また、パッケージに名前を付けることができないため、「ワイルドカード」インポートは機能しません。
はい、リフレクションを使用してこの制限を回避できますが、これは非常に面倒であり、コードが遅く壊れやすくなります。Java でのリフレクションについて学びたい場合は、ここから始めてください - http://docs.oracle.com/javase/tutorial/reflect/index.html。しかし、それはこの「問題」の良い解決策ではありませんか。
正しい解決策は、パッケージを使用することです... Java 言語の設計者が意図したとおりです。JLS は次のように述べています。
「名前のないパッケージは、主に小規模または一時的なアプリケーションを開発するとき、または開発を開始するときに便利なように、Java SE プラットフォームによって提供されます。」
/名前のないパッケージは小さな/一時的なアプリ (または一時的なアプリ) にのみ使用し、深刻な場合は名前付きパッケージの使用に移行する必要があることを意味します。
名前のないパッケージ内の FILE (リソースなど) にアクセスしたい場合は、リソース名の前にスラッシュを付けるだけです。例えば
InputStream is = classLoader.getResourceAsStream("/someresource");
あなたは反省なしではできません。
'デフォルトパッケージ'(パッケージなし)の使用は実際には推奨されていません。これは、それを推奨しないために存在するものの1つです。
「デフォルト」パッケージは、実際にはルート ディレクトリです。絶対パスを使用:
URL url = getClass().getResource("/myphoto.jpg");
InputStream in = getClass().getResourceAsStream("/myphoto.jpg");
作成したjarを7zip/WinZipなどで開きます。ルート ディレクトリにファイルが表示されます。