• ベストアンサー

JAR内のクラス一覧と、メソッド一覧の取得方法

業務システム(の作成のためのフレームワーク)を解析することになりました。 ソースコードが手に入るものと、クラスファイルしかないクラスがあります。 JudeをつかってUMLのクラス図にしてみたら、クラス数が多いため文字が小さく読みづらく なってしまいました。各クラスのメソッド一覧とシグネチャがわかればいいので、 クラス図ではなく一覧をテキストで出力するツールを作ろうと思っています。 すると.class や .jarを読む必要があるのですが、J2SE1.4のどのクラスを使うと できるでしょうか。リフレクション?と思ったのですが、ツールの実行時に読み込まれる.class や .jarではないので リフレクションでは無理でしょうか? ヒントだけでもいいのでお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

javapコマンドで逆コンパイルしてみては? (ライセンスの問題に躓きそうですね…)

thamansa
質問者

お礼

逆コンパイルはjadしか使ったことが無かったのですが、 javapコマンドなら、今回の目的に一番近い出力が得られそうです。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.5

>クラスローダを使うには、基本クラスの分もすべてそろっていないとだめなのでしょうか だめですね。親クラスが入っているjarや、nativeメソッドが使うライブラリ、静的に読み込まれる設定ファイルなどをすべて貰って来ないとエラーになります。 無理ならclassファイルのバイナリを解析しないといけません。 ・Jadを使う Jadはディレクトリ内のファイルなどをまとめてデコンパイルできるはずです。 jarを解凍してディレクトリ内のclassファイルを一気にデコンパイルすれば、ソースは手に入ります。 ・Judeでソースの雛形を出力 クラス図からソースの雛形を出力できるはずなので、それをコンパイルするなり、 ソースファイルのメソッド宣言を拾うなりする。 ・自分で解析ツールを作る これは「がんばってください」としか言い様が… なんにせよ、jarも全てそろっていないと解析や開発に出る影響が大きいのでは?多少上司などにごねてでも調達させた方がよさそうです。

thamansa
質問者

補足

>jarも全てそろっていないと解析や開発に出る影響が大きいのでは? それもそうですね。ドキュメント類がほとんど無いので、最初は全体像を把握するためにJudeでクラス図を起こすところからはじめたのですが、結局細かいところを調べるには動かせないと困りますね。 足りないJARはWebSphere関連のようなので、何とかならないか相談してみます。 ソースから全体像を把握することって今後もあると思うので、ツール化したいところですが、自信がなくなってきたので今回はJadとjavapとJudeでなんとか解析してみます。 皆様ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.4

ツールを作るのなら、 .jarファイルから読むのはその分面倒なので、classファイルだけにするのがいいと思います。(.jarファイルはあらかじめ解凍しておく) で、クラスファイルから情報を取得する方法ですが、 1.ClassLoader(のカスタマイズ)を使って、Classオブジェクトを生成。 (Classファイルをbyte配列に格納し、実行するとClassオブジェクトを取得できる) 2.リフレクションを使ってClassオブジェクトからそのオブジェクトの情報を取得する。 となります。 リフレクションで情報を取って表示するのは結構面倒ですよ。 企画倒れにならないことを祈ります。

thamansa
質問者

お礼

ClassLoaderのサブクラスにURLClassLoaderというのを見つけました。JARファイルも読めそうなので、この線から挑戦したいと思います。 ありがとうございました。

thamansa
質問者

補足

alpha.jar に Sub.class が入っているとして、 SubクラスはSuperクラスを継承しています。 今回、実行に必要なすべてのJARがそろっていないため、Super.classが手元にありません。 URLClassLoaderを使ってみたら、Subクラス のClassオブジェクトを取得しようとしても Super.classに関してjava.lang.NoClassDefFoundError例外が発生してしまいました。 クラスローダを使うには、基本クラスの分もすべてそろっていないとだめなのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

Eclipseで開くのもいいかもしれません。

thamansa
質問者

お礼

クラスの数が少なければEclipseが一番手っ取り早いのですよね。ところが いかんせんクラス数がおおいので、全体を把握するために、各クラスの継承関係とメソッドのシグネチャだけみられるようなものを模索中です。 (クラス図やシーケンス図も一緒に提供されていたらそれだけで解決なんですが・・・)

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

逆コンパイルについて 過去にも質問があったので紹介します。 http://okweb.jp/kotaeru.php3?q=1343563

参考URL:
http://okweb.jp/kotaeru.php3?q=1343563
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • jarファイル内のクラスからjarファイル名の取得

    こんにちわ!yukimura1024です。 ちょっとわかりにくいタイトルかもですが質問です(^^; ○前提条件 1.コマンドプロンプトで以下のようにjarファイルを実行します。  java -jar xxx.jar xxx1 xxx2 2.xxx.jarのなかはx.class、y.class、z.class、と3つのクラスがあり、   x.classのmainメソッドが最初に呼び出されます。 ○質問 上記条件のとき、x.classのmainメソッド内で「xxx.jar」という文字列を取得したいのですが こんなことは可能でしょうか? なぜこんなことをしたいのかというと以下の理由からです。 1.xxx.jarのほかにyyy.jarというjarファイルも作成し、x.class、y.class、z.classを格納する。 2.yyy.jarも最初にx.classのmainメソッドが呼び出される。 3.x.classのmainメソッド内でxxx.jar、yyy.jarのどちらとして呼び出されたのか知りたい! ※2つのjarファイルに格納するx.class、y.class、z.classはまったく同じものです。 アドバイスいただける方いましたらお願いします。

    • ベストアンサー
    • Java
  • JUnitでのプライベートメソッドのテストについて

    JavaSE6で開発をしております。 eclipse3.6を用いて、JUnit3でテストを行っているのですが、 クラスのプライベートメソッドをテストするにはリフレクション以外の方法はないのでしょうか。 リフレクションを使う方法ですと、テストコードが複雑になりがちで、publicメソッドに比べると、テストするのがしんどいです。 JUnit3に限らない、他のテストフレームワークでも構いませんので、プライベートメソッドをテストする、よい方法はないものでしょうか。

    • ベストアンサー
    • Java
  • JARファイル・JARコマンドに関して

    JARファイル・JARコマンドに関しての質問です。 同じクラスファイルを使用して、2つのJARファイルを作成しました。 しかし、バイナリツールでファイルを比較したところ、バイナリデータの一致が取れませんでした。 下記に、例と質問を記載します。 ご存知の方がおりましたら、ご教授よろしくお願いします。 例: 1.jar cf C:\java\test\HelloWorld1.jar C:\java\test\HelloWorld.class (クラスファイルをHelloWorld1.jarというJARファイルを作成します。) 2.jar cf C:\java\test\HelloWorld2.jar C:\java\test\HelloWorld.class (クラスファイルをHelloWorld2.jarというJARファイルを作成します。) ※HelloWorld.classはhelloと表示されるだけの簡単プログラムです。 1で作成されたJARファイルと、2で作成されたJARファイルをバイナリで比較したところ一致しませんでした。 ■質問 1.JARコマンドはJARファイルを作成する際に何をしているのでしょうか? 2.同じクラスファイルでJARファイルを作成しているのに、バイナリデータに差がでるのはなぜでしょうか? JARファイル作成時に作成時間等をファイルに保持しているのでしょうか? (作成時間が違うため、JARファイルで差がでるのでは、と推測しています・・・・) いろいろ調べてみたのですが、良い情報が見つかりませんでした。 参考URLだけでも結構です。 ご存知の方がいましたら、ご教授よろしくお願いします。m(_ _)m

    • ベストアンサー
    • Java
  • importでクラスを呼び込みたい

    今、javaプログラムでjarファイルの中のクラスを呼び込む というものを作成しています。 プログラムでjarファイル内のクラスを呼び込むためにimportを 使ってクラスを使いますということを宣言しなくてはいけないのですが、importが上手くいかずエラーが出てしまい、プログラムがコンパイルできません。 クラスを含んだjarファイルの場所は /home/kimura/javahello/JarTest.jar です。その中にHello.classというクラスメソッドが入っておりそれを 別の場所で作成しているプログラムで呼び出し使いたいと思っています。 importの記述方法が分からず困っています。 この記述方法分かるという方がいらっしゃったら教えてください。 参考サイトなどもお知りでしたらよろしくお願いします。

    • ベストアンサー
    • Java
  • jarの配置・参照について

    Aproject内にmain,helperとパッケージを作成し、 他チームも共通で利用するhelper内の複数クラスからjarを作成しました。 main内にはmainメソッドを含むクラスが1つのみですが、 他チームは別途mainを含むクラスを作成しています。 Linuxサーバ上/tmp/Aproject/mainにaaaa.classを配置し、 jarを/tmp/Aproject/helper/helper.jarのように配置した場合、 どこにどのようにパスを通すべきなのでしょうか? いろいろ試してみたのですが、うまくいきません。 不足情報ありましたら随時回答します。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • jarファイル内のJava クラスを列挙する

    こんにちは。早速ですが、 与えられたjarファイルからクラスファイルを見つけ出し、その名前・フィールド・メソッド・パラメータ・タイプを列挙させようと思います。 すべてのクラスの関連や、汎化も考慮します。 出力は以下のようにしたいと思います。 Class Class_Name extends Another_Class_name Attribute: Attribute_name : Attribute_type; Methods: Method_name (Parameter_name : Parameter_type) : Return_type; Association: To_the_other_end_class_name; 今のところ、下記のようにjarファイルを読み込むところまで作ってみたのですが、この後のデータ処理が分かりません。 実は、Java自体初心者に近く、締め切りも近いため焦っています。ご教授いただけるととても嬉しいです。 ちなみに環境は、IBM Rational Software Architectです。Java1.4までのサポートですので、genericタイプなしでお願いします。 public class CReader { public static void main (final String[] args) throws Exception { ClassReader cr = new ClassReader("CReader"); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_DEBUG); JarFile jar = new JarFile(jarfile); Enumeration files = jar.entries(); while (filest.hasMoreElements()) { ZipEntry entry = (ZipEntry)files.nextElement(); System.out.println(entry.getName()); } byte[] buf = new byte[1024]; int readsize = 0; InputStream is = jar.getInputStream(entry); while ((readsize = is.read(buf, 0, 1024)) != -1) { List methods = cn.methods; for(int i=0; i<methods.size(); i++){ MethodNode method = (MethodNode) methods.get(i); if(method.instructions.size() > 0){ ????? } } } is.close(); } }

    • ベストアンサー
    • Java
  • 外部jarの標準出力を取得できますか?

    ClassLoaderで外部jarのクラスをロードし、実行するプログラムを作りました。 SimpleOutputは、単に渡された引数を標準出力に出すだけのものです。 この値を取得してGUI上に表示させたいのですが、取得する方法をご教授ください。 System.out.println("Load class"); URL[] urls = { file.toURI().toURL() }; ClassLoader loader = URLClassLoader.newInstance(urls); Class<?> cls = loader.loadClass("SimpleOutput"); System.out.println(cls); Object obj = cls.newInstance(); Method method = cls.getMethod("main", String[].class); String[] av = {"test"}; method.invoke(obj, new Object[]{av});

    • ベストアンサー
    • Java
  • リフレクションでフィールドのインスタンス取得

    リフレクションを使ってフィールドの型やオブジェクトのタイプ、名前などは取得できるのですが、それ自身のインスタンスを取得できません。 ClassオブジェクトのnewInstanceでは、新しく作ってしまうのでだめでした。なにかよい方法はないでしょうか? class Parent{ Foo foo1,foo2; Bar bar; } というクラスでbarからfoo1,foo2のメソッドを呼び出したいのですが、 Fooは何個定義されるかわからない状態です。 Barないでリフレクションを使ってfoo1,foo2をあらわすClassやFieldは取得できるのですが、foo1,foo2自身が取得したいのです。 よろしくお願いします

    • ベストアンサー
    • Java
  • どうしても、サーブレットを見つけてくれない場合の解決方法

    ルートディレクトリからWEB-INFを辿って、classesまで行き、そこにパッケージ化したクラスファイルを置きます。 それでも何故かサーブレットを見つけてくれません。 PC上には他に、EclipseとJudeというUML開発ツールが入っています>関係ないかもしれませんが。 勿論、invokerのコメントを外し、サーブレットも使えるのですが……。 とても困っています。 どんな方法でも構いませんので、是非ともレスを下さい。お待ちしております。

  • Eclipseで、配布可能なJARファイルを作成する方法が解りません。

    Eclipseで、何も無いウインドウを開くというだけのアプリケーションを作ろうとしました。 ライブラリに、 org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar を追加しております。 配布できる形式にしたいため、Jarファイルを作成しました。 プロジェクトにMETA-INFというフォルダを作成し、そこに「Manifest.mf」というファイルを作成し、以下のように記述しました。 Manifest-Version: 1.0 Class-Path: "C:\eclipse\plugins\org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar" Main-Class: view.TestWindow ちなみに、「view.TestWindow」というのがmainメソッドのあるクラスの名前です。 JARファイルをエクスポートして、コマンドライン上から以下のように入力しました。 > java -jar TestWindow.jar 結果は、以下のようなエラーが表示されました。 Failed to load Main-Class manifest attribute from TestWindow.jar 多分、「Main-Class」の情報がマニフェストファイルから見つからないと言っているんだと思いますが、Eclipse上からエクスポートする際にはちゃんと場所を指定しています。何が問題なのか解りません。 将来的には、違うマシン上で動作するアプリケーションを作りたいと思っているのですが、最初でいきなり躓いてしまいました。 どなたか教えて頂けないでしょうか。

    • ベストアンサー
    • Java