web-dev-qa-db-ja.com

Javaでパッケージ名を含む現在のクラス名を取得する方法は?

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

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

問題は、これはパッケージが格納されているディレクトリのみを提供することです。つまり、「.../project/this/is/package/name」に格納されたクラスがある場合、「/project/」のみを提供し、パッケージ名を無視します。実際の.class filesが存在する場所。

助言がありますか?

編集:これは、運動の説明から取られた説明です

sourcedirは、絶対(「/」で始まる)またはプログラムを実行する場所に相対的

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

72
La bla bla

this.getClass().getCanonicalName()を使用して、完全なクラス名を取得します。

パッケージ/クラス名( "a.b.C")は.classファイル(a/b/C.class)のパスとは異なります。また、パッケージ名/クラス名を使用してパスを派生させるのは一般的に悪い習慣です。クラスファイル/パッケージのセットは、ディレクトリまたはjarファイルである複数の異なるクラスパスに存在できます。

147
The Nail

これを行うことができるクラス 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がパッケージMyClassのクラスmypackageを表す場合、上記のコードは次のように出力します。

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

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

25
Jon Egeland

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

String fqn = YourClass.class.getName();

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

InputStream in = YourClass.getResourceAsStream("resource.txt");
11
Bozho

this.getClass().getName()を使用してpackageName.classNameを取得し、this.getClass().getSimpleName()を使用してクラス名のみを取得します

3
Zahangir Alam