2012-03-15 30 views
56

私はプロジェクトで取り組んでいます。メインメソッドの2番目の引数が '/'(Linuxの場合)で始まる場合、絶対パスとみなす必要があります(問題ありません) '/'で始まらなければ、クラスの現在の作業パスを取得し、与えられた引数にそれを追加する必要があります。パッケージを含む現在のクラス名を取得する

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

問題があり、これは私だけのパッケージが格納されているディレクトリを与える - 私が持っているつまり場合".../project/this/is/package/name"に格納されているクラスは、 "/ project /"だけを与え、実際の.classファイルがあるパッケージ名は無視します。

提案がありますか?

EDIT: ここ

SOURCEDIRは絶対(「/」で始まる)、または我々は

SOURCEDIRからプログラムを実行する場所からの相対のいずれかになります行使の記述から取られた説明は、ですメインメソッドの引数です。どのように私はそのパスを見つけることができますか?

+2

コードがJARにパッケージ化されている(またはそうでなければあなたが想定しているフォルダ/ファイル構造にない)場合、あなたはどうしますか?それは危険な前提です。これは小さな実験、クラス割り当て、またはその他の使い捨ての状況でうまくいくかもしれませんが、生産品質のコードのための前提を作る習慣にはならないでください。 –

+0

クラスファイルへのパスを見つける意味がありません。また、練習の説明には、慎重に読んでいるとは言及されていません(*プログラムから*を実行する場所は、プログラムがユーザーから呼び出される現在のパスを意味します)。 –

+0

要件をよく理解するのに役立つかもしれませんか?議論が '/'で始まっていることを確認する必要があります。そうであれば、それを絶対として使用してください。そのまま。しかし、もしそうでなければ、私はそれをどのように扱うべきですか? –

答えて

112

this.getClass().getCanonicalName()を使用すると、完全なクラス名を取得できます。

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

+0

ありがとうございますが、それはメインメソッドにあり、 'this'は静的メソッドでは使用できません。それを取り巻くどのような仕事? –

+0

http://stackoverflow.com/questions/936684/getting-the-class-name-from-a-static-method-in-java –

+0

は質問を編集しました。より良い説明をする –

16

、それがこれを行うことができます:パッケージmypackageでクラスMyClassを表す

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場合は、上記のコードは印刷されます:

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

この情報を入手して、必要に応じて変更するか、詳細についてはcheck the APIにお問い合わせください。

+0

Class.forName( "MyClass")は、デフォルトのパッケージに含まれている(つまり、パッケージ宣言がない)場合にのみ機能します。 –

+1

@TheNail true、 'getName()'はパッケージ名をクラス名と共に返します。 – Jon

+0

'getSimpleName()'を使用して、パッケージ名なしのクラス名だけを取得します。 –

6

完全修飾名は次のようにopbtainedさ:

String fqn = YourClass.class.getName(); 

しかし、あなたは、クラスパスリソースを読み込む必要があります。したがって、使用する

InputStream in = YourClass.getResourceAsStream("resource.txt"); 
関連する問題