91

私はプロジェクトに取り組んでおり、1 つの要件は、メイン メソッドの 2 番目の引数が「<code>/」(Linux の場合) で始まる場合、それを絶対パスと見なす必要があります (問題ではありません)。 「<code>/」で始まる場合、クラスの現在の作業パスを取得し、それに指定された引数を追加する必要があります。

クラス名はいくつかの方法で取得できます: System.getProperty("java.class.path")new File(".")および などgetCanonicalPath()...

問題は、これはパッケージが保存されているディレクトリだけを提供することです。つまり、クラスが " .../project/this/is/package/name" に保存されている場合、" " しか提供されず/project/、実際に存在するパッケージ名は無視され.class filesます。

助言がありますか?

編集:演習の説明から取られた説明は次のとおりです

sourcedir は、絶対 (「/」で始まる) またはプログラムを実行する場所からの相対のいずれかです。

sourcedir は、main メソッドの指定された引数です。どうすればそのパスを見つけることができますか?

4

4 に答える 4

182

this.getClass().getCanonicalName()完全なクラス名を取得するために使用します。

パッケージ/クラス名 (「abC」) は .class ファイル (a/b/C.class) のパスとは異なることに注意してください。また、パッケージ名/クラス名を使用してパスを導出することは、通常は悪い習慣です。クラス ファイル/パッケージのセットは、複数の異なるクラス パス (ディレクトリまたは jar ファイル) に配置できます。

于 2012-03-15T22:39:33.103 に答える
32

これを行うことができるクラスがありClassます:

Class c = Class.forName("MyClass"); // if you want to specify a class
Class c = this.getClass();          // if you want to use the current class

System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName());

パッケージ内cのクラスを表す場合、上記のコードは次のように出力されます。MyClassmypackage

パッケージ:mypackage
クラス:MyClass
完全な識別子:mypackage.MyClass

この情報を取得して必要に応じて変更するか、APIで詳細を確認してください。

于 2012-03-15T22:43:33.850 に答える
14

完全修飾名は次のように取得されます。

String fqn = YourClass.class.getName();

ただし、クラスパス リソースを読み取る必要があります。だから使う

InputStream in = YourClass.getResourceAsStream("resource.txt");
于 2012-03-15T22:47:46.883 に答える