私はプロジェクトに取り組んでおり、1つの要件は、メインメソッドの2番目の引数が「/
」(Linuxの場合)で始まる場合、絶対パス(問題ではない)と見なすべきですが、そうでない場合「/
」で始まるのではなく、クラスの現在の作業パスを取得し、指定された引数を追加する必要があります。
クラス名はいくつかの方法で取得できます:System.getProperty("Java.class.path")
、new File(".")
、getCanonicalPath()
など...
問題は、これはパッケージが格納されているディレクトリのみを提供することです。つまり、「.../project/this/is/package/name
」に格納されたクラスがある場合、「/project/
」のみを提供し、パッケージ名を無視します。実際の.class files
が存在する場所。
助言がありますか?
編集:これは、運動の説明から取られた説明です
sourcedirは、絶対(「/」で始まる)またはプログラムを実行する場所に相対的
sourcedirは、mainメソッドの特定の引数です。どうすればそのパスを見つけることができますか?
this.getClass().getCanonicalName()
を使用して、完全なクラス名を取得します。
パッケージ/クラス名( "a.b.C")は.classファイル(a/b/C.class)のパスとは異なります。また、パッケージ名/クラス名を使用してパスを派生させるのは一般的に悪い習慣です。クラスファイル/パッケージのセットは、ディレクトリまたはjarファイルである複数の異なるクラスパスに存在できます。
これを行うことができるクラス 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を確認してください に進んでください。
完全修飾名は次のように取得されます。
String fqn = YourClass.class.getName();
ただし、クラスパスリソースを読み取る必要があります。だから使用する
InputStream in = YourClass.getResourceAsStream("resource.txt");
this.getClass().getName()
を使用してpackageName.className
を取得し、this.getClass().getSimpleName()
を使用してクラス名のみを取得します