Javaでクラスからそのクラスが入ってるJarを取得する方法

なんかロードしたクラスが古いっぽい。
> あれれー。あったはずのメソッドがないよー?
的な問題であったり、ロード済みのJarをリストアップしてハッキングは地獄だぜフゥーハハーだったりしたい時に何気に便利でなにげにどこにも書かれてなかったりするJarファイルの探し方。

ロードしたのはClassLoaderなんだからClassLoaderに聞けばいいんじゃね?

ということでさらりとClassLoader先生に聞いてみる。

 // こいつがJarを探す元になるクラス
  Hoge hoge = new Hoge();
  ClassLoader classLoader = hoge.getClass().getClassLoader();
  URL classURL = classLoader.getResource(hoge.getName());

このURLが
> jar:file:/opt/hoge/lib/hoge.jar!/any/pack/age/Hoge.class
とかになってるから困る。
Jarプロトコルとか何だよ。

URLったらネットでしょ。ネットならコネクトしたらよくね?

  Connection conn = classURL.openConnection();
  System.out.println(conn.getClass().getName());

とりあえず出てきたクラスを調べてみる。

> java.net.JarURLConnection

ヽ(゚∀゚)ノ

JarURLConnectionからひねり出す。

  JarURLConnection jarConn = (JarURLConnection)conn ;
  URL fileURL = jarConn.getJarFileURL();
  File jarFile = new File(fileURL);
  System.out.println(jarFile.getAbsolutePath());

それっぽいメソッドをコール。

> /opt/hoge/lib/hoge.jar

ヽ(゚∀゚)ノ キタコレ

ついでだからJarの中身も覗いてみる

  Manifest manifest = jarConn.getManifest();
  Attributes attributes = manifest.getAttributes();
  for (String mapKey : attributes.getEntries().keySet()){

    System.out.println("MapKey = "+mapKey);

    Attributes subAttributes = attributes.get(mapKey);
    for (String key = subAttributes.getEntries().keySet()){
        System.out.println(String.format("\t%s = %s",new Object[]{key,subAttributes.get(key)}));
    }
  }

ヽ(゚∀゚)ノ ウヒョー

なにげに

実はこれみんな知ってた?