challenge 自分自身のファイル名を知る方法

自分自身のファイル名を知る方法を示してください。

ビルド後のファイルが、hogehoge.exeであれば、
”hogehoge.exe”が表示されるようなプログラムを書いてください。
スクリプト言語でも同様です。

ファイル名が変更されたらそれに追従するようにしてください。

Posted feedbacks - Java

Javaではもともとクラス名=ファイル名なので、パスを含めてURLで表示してみました。

1
2
3
4
5
6
7
8
9
package doukaku;

public class MyFilename {
   public static void main(String[] args) {
      System.out.println(
          MyFilename.class.getClassLoader().getResource(
              MyFilename.class.getName().replaceAll("\\.","/")+".class"));
   }
}

#5797 のコメントでこのお題は全てなのですが、static メソッドからは自分自身のクラス名が取れない事が気になって、強引に外部からクラス名を取る事を試みてみました。

コマンドラインを取得して起動コマンドからクラス名を取得する戦略です。ただし、Javaからは生のコマンドラインが取れないため、ps コマンドを外部起動して ps コマンドの ppid から自分自身の pid を取得し、コマンドラインを求めています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.*;
import java.util.*;
import java.util.regex.*;

public class Sample {
    public static final Pattern psPattern = Pattern.compile("ps -Awwo pid");
    public static void main(String[] args) throws Exception { 
        Runtime rt = Runtime.getRuntime();
        Process p = rt.exec(new String[]{"ps", "-Awwo", "pid,ppid,command"});
        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line, javaPid = "";
        HashMap<String, String> pMap = new HashMap<String, String>();
        while ((line = r.readLine()) != null) {
            String[] token = line.split("\\s+", 4);
            pMap.put(token[1], token[3]);
            if (psPattern.matcher(token[3]).find()) {
                javaPid = token[2];
            }
        }
        String[] token = pMap.get(javaPid).split("\\s+");
        System.out.println(token[1] + ".class");
    }
}

#5812 はOSに依存します(ちなみに、Mac OS Xで確認しました)。クラス名を得るだけであれば、別にコマンドラインを取得する必要はないので、もっと単純な方法も提示しておきます。

1
2
3
4
5
6
7
public class Sample2 {
    public static void main(String[] args){ 
        Exception ex = new Exception();
        StackTraceElement[] st = ex.getStackTrace();
        System.out.println(st[0].getClassName() + ".class");
    }
}

Index

Feed

Other

Link

Pathtraq

loading...