- ベストアンサー
JAR内のクラス一覧と、メソッド一覧の取得方法
業務システム(の作成のためのフレームワーク)を解析することになりました。 ソースコードが手に入るものと、クラスファイルしかないクラスがあります。 JudeをつかってUMLのクラス図にしてみたら、クラス数が多いため文字が小さく読みづらく なってしまいました。各クラスのメソッド一覧とシグネチャがわかればいいので、 クラス図ではなく一覧をテキストで出力するツールを作ろうと思っています。 すると.class や .jarを読む必要があるのですが、J2SE1.4のどのクラスを使うと できるでしょうか。リフレクション?と思ったのですが、ツールの実行時に読み込まれる.class や .jarではないので リフレクションでは無理でしょうか? ヒントだけでもいいのでお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
- deadlock
- ベストアンサー率67% (59/87)
- ngsvx
- ベストアンサー率49% (157/315)
- pcbeginner
- ベストアンサー率46% (261/560)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
関連する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のコメントを外し、サーブレットも使えるのですが……。 とても困っています。 どんな方法でも構いませんので、是非ともレスを下さい。お待ちしております。
- 締切済み
- Java
- 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
お礼
逆コンパイルはjadしか使ったことが無かったのですが、 javapコマンドなら、今回の目的に一番近い出力が得られそうです。 ありがとうございました。