Javaでパッケージ名を含む現在のクラス名を取得するにはどうすればよいですか?


82

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

:私はいくつかの方法でクラス名を取得することができSystem.getProperty("java.class.path")new File(".")およびgetCanonicalPath()ように、と...

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

助言がありますか?

編集:これは演習の説明から取られた説明です

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

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


2
コードがJARにパッケージ化されている場合(または、想定しているようなフォルダー/ファイル構造に含まれていない場合)はどうしますか?これは危険な仮定です。これは、小規模な実験、クラスの割り当て、またはその他の使い捨ての状況では問題なく機能する可能性がありますが、本番品質のコードについてその仮定を行う習慣を身に付けないでください。
e-Riz 2012年

クラスファイルへのパスを見つける意味はありません。また、演習の説明には、注意深く読んだ場合(プログラムを実行する場所とは、ユーザーがプログラムを呼び出す現在のパスを意味します)については記載されていません。
ネイル

たぶんあなたは私が要件をよりよく理解するのを手伝ってくれるでしょうか?引数が「/」で始まることを確認する必要があります(説明の記載)。もしそうなら、それを絶対として使用してください。そのまま。しかし、そうでない場合は、どのように扱うべきですか?
La bla bla 2012年

回答:


166

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

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


感謝しますが、これはmainメソッドにあり、「this」は静的メソッドでは使用できません。それを回避する方法はありますか?
La bla bla 2012年


30

これ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で詳細を確認してください。


1
Class.forName( "MyClass")は、デフォルトのパッケージに含まれている(つまり、パッケージ宣言がない)場合にのみ機能することに注意してください。
ネイル

2
@TheNail trueでgetName()、パッケージ名とクラス名を返します。今すぐ編集します。
Jon Egeland 2012年

getSimpleName()パッケージ名なしでクラス名のみを取得するために使用します。
ネイル

1
他の理由でランタイムディスカバリーが本当に必要でない限り、代わりにClass.forName("MyClass")使用するMyClass.class必要があります。
mjaggard 2015

12

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

String fqn = YourClass.class.getName();

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

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

3

使用this.getClass().getName()取得するにはpackageName.className、使用するには、this.getClass().getSimpleName()クラス名のみを取得するには

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.