• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:jarファイル内のJava クラスを列挙する)

jarファイル内のJava クラスを列挙する

sasadoraの回答

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.3

import 文を書いていなかったので、 違うパッケージのFieldをインポートしてないでしょうか? java.lang.reflect.Fieldになります。 (getTypeが使えないというのも、同じ理由かも) 一応、インポート文も提示しておきます。 import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import java.util.Enumeration; import java.util.Iterator; import java.util.jar.JarEntry; import java.util.jar.JarFile;

pooh_bear
質問者

お礼

あ!という感じです。 一通りのimport文は入っていたのですが、 肝心のjava.lang.reflect.Fieldと java.lang.reflect.Methodがはいっていませんでした。。。 パラメータですが、フィールドやメソッドと同様にやろうと思ったのですが、いまいちどう取得するものか分かりません。 甘えすぎているのはわかっているのですが・・・もしヒントだけでもいただけたら嬉しいです。

関連するQ&A

  • Jarコマンドでマニフェストファイルを更新

    jdk 1.6.0.26のjarコマンドを使って、既存のjarファイルのマニフェストファイルを更新したいのですが、下記のように警告が表示されてしまいます。 (下記例は、既存のtest.jarにマニフェストファイルmanifest.txtを更新する例です) >jar uvmf manifest.txt test.jar 2011/08/15 1:54:26 java.util.jar.Attributes read 警告: Duplicate name in Manifest: Main-Class. Ensure that the manifest does not have duplicate entries, and that blank lines separate individual sections in both your manifest and in the META-INF/MANIFEST.MF entry in the jar file. 2011/08/15 1:54:26 java.util.jar.Attributes read 警告: Duplicate name in Manifest: Class-Path. Ensure that the manifest does not have duplicate entries, and that blank lines separate individual sections in both your manifest and in the META-INF/MANIFEST.MF entry in the jar file. マニフェストが更新されました。 ちなみに、既存のtest.jarのマニフェストファイルの内容は、下記のようになっており、 Main-Class: jp.main.MainClass Class-Path: hello.jar manifest.txtの内容は、下記のようになっています。 Main-Class: jp.main.MainClass Class-Path: hello2.jar つまり、Class-Pathの所を別なjarファイルに書き換えたいわけです。 上記のjarコマンドで、警告はでますが、実行するとhello2.jarが動作しているようなので、大丈夫なのですが、警告が出るということは、やり方が悪いのでしょうか?

    • ベストアンサー
    • Java
  • デフォルトの定義済みクラスについて

    自分で定義したクラスの継承関係やらを出力するサンプルスクリプトがあったので、それをまる写しして動かしたところ、エラーがおこりました。以下のスクリプトがそれです。 <?php function get_methods($object){ $methods=get_class_methods(get_class($object)); if(get_parent_class($object)){ $parent_methods=get_class_methods(get_parent_class($object)); $methods=array_diff($methods,$parent_methods); } return $methods; } function get_inherited_methods($object){ $methods=get_class_methods(get_class($object)); if(get_parent_class($object)){ $parent_methods=get_class_methods(get_parent_class($object)); $methods=array_intersect($methods,$parent_methods); } return $methods; function get_lineage($object){ if(get_parent_class($object)){ $parent=get_parent_class($object); $parent_object=new $parent; $lineage=get_lineage($parent_object); $lineage[]=get_class($object); } else{ $lineage=array(get_class($object)); } return $lineage; } function get_child_classes($object){ $classes=get_declared_classes(); $children=array(); foreach($classes as $class){ if(substr($class,0,2)=='__'){ //ここに問題があるようです。 continue; } $child=new $class; //ここで「引数が無効」のエラーになります。 if(get_parent_class($child)==get_class($object)){ $children[]=$class; } } return $children; } function print_object_info($object){ $class=get_class($object); echo '<h2>クラス</h2>'; echo "<p>$class</p>"; echo '<h2>継承関係</h2>'; echo '<h3>親クラス</h3>'; $lineage=get_lineage($object); array_pop($lineage); echo count($lineage)?('<p>'.join(' -&gt; ',$lineage).'</p>'):'<i>None</i>'; echo '<h3>子クラス</h3>'; $children=get_child_classes($object); echo '<p>'.(count($children)?join(',',$children):'<i>None</i>').'</p>'; echo '<h2>メソッド</h2>'; $methods=get_class_methods($class); $object_methods=get_methods($object); if(!count($methods)){ echo "<i>なし</i><br/>"; } else{ echo '<p>継承しているメソッドは、<i>斜体</i>で表示します。</p>'; foreach($methods as $method){ echo in_array($method,$object_methods)?"<b>$method</b>();<br/>":"<i>$method</i>();<br/>"; } } echo '<h2>プロパティ</h2>'; $properties=get_class_vars($class); if(!count($properties)){ echo "<i>なし</i><br/>"; } else{ foreach(array_keys($properties) as $property){ echo "<b>\$$property</b>=".$object->$property.'<br/>'; } } echo '<hr/>'; } //省略しましたがここにクラスA、B、Cを用意しました。 $a=new A; $a->foo='sylvie'; $a->bar=23; $b=new B; $b->foo='bruno'; $b->quux=true; $c=new C; print_object_info($a); print_object_info($b); print_object_info($c); ?> これを実行すると途中からエラーになります。$classがどんな値か出力するために、 foreach($classes as $renban=>$class){ print_r("{$renban}:{$class}\n<br/>"); } にして出力したら、 0:stdClass …… 139:A 140:B 141:C になりました。(get_declared_classes()が返す値は、スクリプト内で自分が定義したクラス以外に、PHPがデフォルトで定義しているクラスもあることに、昨日気づきました。) 本を書いた人は、foreach文の直後の if(substr($class,0,2)=='__'){ continue; } の所でデフォルトの定義済みクラスを除外する目的だったと思います。 ここを、 foreach($classes as $class){ if(substr($class,0,1)!='A||B||C'){ continue; } に変えたらちゃんと画面が表示されました。 本を書いた人はなぜ、if(substr($class,0,2)=='__')にしたのでしょうか?また、if(substr($class,0,1)!='A||B||C')だとあらかじめ自分が定義しているクラスを記述しているのでなにかぱっとしない感じがします。自分が定義したクラス以外を除外という書き方でなく、デフォルトの定義済みクラスをうまく除外する方法などございましたらアドバイスの方よろしくお願いします。 こちらの環境は、windows vistaにxampp1.6.5、php5.2.5です。よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルの入出力をするプログラム

    1週間前からJAVAを勉強しております。 簡単な練習で、テキストファイル(test.txt)に縦一列に並んでいる数字を読み込み別のテキストファイルに書き込むプログラムを作っておりますが FileInputStream file = new FileInputStream("test.txt"); file.read(buf_byte); for(i=0;i<=10;i++)buf_char[i]=(char)buf_byte[i]; という感じで恐らく回りくどいことをしてると思いますが、ダイレクトに文字を読み込む方法がわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaによるファイル送信のプログラム

    ユニキャスト通信のおけるプログラミングで、1のプログラムを2のプログラムを使ってファイル送信ができるようにしたいのですがうまくいきません。私のjavaの知識が授業についていかなくて図書館でいろいろと本を探したのですが見つかりませんでした。誰か教えていただけませんか? /*1*/ import java.net.*; import java.io.*; public class udpechoServer{ static final int echo_PORT = 7; //エコーポート番号 static final int BUFSIZE = 1024; //バッファサイズ public static void main(String[] args) throws IOException{ int port = echo_PORT; //ポート番号 int cliport; //クライアントポート番号 int len; //データ長 int i; //キーインバッファクリアインデックス DatagramSocket sock = null; //データグラムソケット宣言,初期化 byte[] buf = new byte[BUFSIZE]; byte[] wbuf = new byte[BUFSIZE]; String recvdata; //受信データ try{ sock = new DatagramSocket(port); DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE); DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE); System.out.println("Connected to echo server"); while(true){ sock.receive(recvpacket); //データ受信 recvdata = new String(recvpacket.getData(),0,recvpacket.getLength()); recvdata = recvdata.trim(); //トリミング(CRLF) wbuf = recvdata.getBytes(); //文字列→バイト配列変換 i = 0; len = wbuf.length; buf = new byte[BUFSIZE]; while(wbuf[i] != 0x0d){ //途中のCR検出 buf[i] = wbuf[i]; //データコピー i++; if(i >=len){ break; } } recvdata = new String(buf,0,i); //バイト配列→文字列変換 System.out.println(recvdata); //画面出力 InetAddress ipadr = recvpacket.getAddress(); cliport = recvpacket.getPort(); buf = recvdata.getBytes(); len = buf.length; sendpacket = new DatagramPacket(buf,len,ipadr,cliport); sock.send(sendpacket); //データ送信 recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット } }catch(SocketException e){ e.printStackTrace(); } } } /*2 */ import java.io.*; class FileCopy { public static void main(String argv[]){ try{ InputStream in = new FileInputStream(argv[0]); //入力ファイルを開く //BufferedInputStreamオブジェクトの生成 BufferedInputStream bin = new BufferedInputStream(in); OutputStream out = new FileOutputStream(argv[1]); //出力ファイルを開く //BufferedOutputStreamオブジェクトの生成 BufferedOutputStream bout = new BufferedOutputStream(out); byte buf[] = new byte[1024]; int c; //読み込みデータがなくなるまで読み込み while((c = bin.read(buf, 0, buf.length)) != -1){ bout.write(buf, 0, c); //データの書き込み処理 } System.out.println("\""+argv[0]+"\" was converted into \""+argv[1]+"\""); bin.close(); //入力ファイルを閉じる bout.close(); //出力ファイルを閉じる }catch(Exception e){} } }

    • ベストアンサー
    • Java
  • 「シンボルを見つけれません」というエラーへの対処法

    下記のコードの If(type.compareTo("名詞") == 0); で「シンボルを見つけれません」「シンボル:メソッドif(boolean)」というエラーが出てしまいます。 なぜ、他のif文ではエラーが出ないのにこの行ではエラーが出るのか分かりません。 対処法を教えていただけないでしょうか? public void set_dictionary(String dict_filename) { } public int run(byte[] text, int start, int length, byte[] terms) { String type; //品詞の比較用 byte[] buf1 = new byte[1000]; //textの内容を一時的に格納しておくための配列1 byte[] buf2 = new byte[1000]; //textの内容を一時的に格納しておくための配列2 int i, j, k, count1, count2, FLG; count1 = 0; count2 = 0; k = 0; FLG = 0; for(i = start; i < length; i++) { if(text[i] == '\t') { FLG = 1; count2 = 0; } else if(text[i] == ' ') { FLG = 0; count1 = 0; } else { if(FLG == 1) { buf2[count2++] = text[i]; } else if(FLG == 0) { buf1[count1++] = text[i]; } } if((count2 == 5)&&(FLG == 1)) { type = new String(buf2, 0, 4); If(type.compareTo("名詞") == 0); { for(j = 0; j < count1; j++) { terms[k++] = buf1[j]; } terms[k++] = '/'; } count2 = 0; FLG = 2; } } return k; //term中のデータの長さを返す }

  • Zip(Pass)のファイルの解凍時間の短縮

    Zip(Pass)のファイルの解凍時間の短縮 JavaでZip(Pass)のファイルをSDカードから読込む処理を実装してます。 実際にほしいのは1つのEntryだけで現在下記のように実装してますが、 一つの画像(500kb程度)を引き出すのに4秒以上掛かってしまいます。 zf = new ZipFile(new File(filaName), "UTF-8"); zf.setPassword(password.getBytes("UTF-8")); zf.setCheckCrc(true); //since 2008-12-21 for (Iterator<ZipEntry> i = zf.getEntriesIterator(); i.hasNext();) { ze = i.next(); if(ze.getName().equals(pageNo)){ is = zf.getInputStream(ze); bos = new ByteArrayOutputStream(); for (;;) { int size = is.read(); if (size == -1) break; bos.write(size); } is.close(); b= bos.toByteArray(); bos.close(); break; } } zf.close(); もっと効率の良い実装方法ありますでしょうか? Iterator<ZipEntry>を使用せずにZipFileのgetEntry(String)で使えると思いましたがZipEntryが戻りませんでした。 ZipPassはhisidamaさんのサイトからjarを使わせて頂いてます。 http://www.ne.jp/asahi/hishidama/home/tech/soft/java/zip.html 全て展開すると時間が掛かるので必要なEntryだけ取り出して使いたいです。 以上、よろしくお願いします。

    • ベストアンサー
    • Java
  • ファイル圧縮について。

    ファイル圧縮について質問させてください。 以下のようなメソッドを作成したのですが、 public run(String strFiles[], String strZipFileName) { int i = 0; int iLen = 0; FileInputStream fis = null; FileOutputStream fos = null; ZipOutputStream zos = null; ZipEntry zent = null; byte[] buf = new byte[1024*10*10]; try { fos = new FileOutputStream(strZipFileName); zos = new ZipOutputStream(fos); for (i = 0; i < strFiles.length(); i++) { fis = new FileInputStream(strFiles[i]); zent = new ZipEntry(strFiles[i]); zos.putNextEntry(zent); while (-1 != (iLen = fis.read(buf))) { zos.write(buf, 0, iLen); } zos.flush(); zos.closeEntry(); fis.close(); } } catch(Exception e) { System.err.println(e); } finally { try { zos.close(); // ※1 fos.close(); // ※2 } catch(Exception e) { System.err.println(e); } } } サイズの小さいファイルや、 特定のサイズのファイル(13k程度)を対象とした時、 高い確率で、空の圧縮ファイルが作成される事があります。 ログを出力しながら確認すると、このような現象が起きた場合、 圧縮ファイルをcloseする直前(※1)では作成されたファイルはサイズがあるのですが、 圧縮ファイルをcloseした直後(※2)ではファイルのサイズが0になってしまいます。 また、2台あるサーバの内、1台だけでこの現象が起こっています。 javaのバージョンは1.3です。 何故このような現象が起こってしまうのか、 ご存知の方がいらっしゃいましたら教えていただけないでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java
  • ファイル読み込みを配列に入れる方法

    ファイルから数字を読み込んで 並び替えて出力するプログラムを作成しているのですが ファイルから一度に配列に取り込んで、その配列で並び変えたいのですが取り込みができないのです、int型の配列に一度に取り込むのは可能なのでしょうか? import java.io.*; class Sort { public static void main(String[] args) { String path = args[0]; File file = new File(path); FileReader fr = null; int[] buf = new int[(int)file.length()]; try { fr = new FileReader(file); fr.read(buf); for (int i=0; i<buf.length-1;i++) { int mini=buf[i]; int miniIndex = i; for(int j = i+1; j<buf.length;j++){ if(buf[j] < mini){ mini = buf[j]; miniIndex = j; } } buf[miniIndex] = buf[i]; buf[i] = mini; } for(int i =0; i<buf.length;i++) { System.out.print( buf[i]+","); } } catch (IOException e) { System.out.println("ファイル入力エラー"); } } } と作ってみたのですが‥ ご教授お願いいたします。

    • ベストアンサー
    • Java
  • [C#]FTPでの複数のファイルのアップロード

    ネットで調べたところ1つのファイルであれば、 下記の記述でアップロードできることがわかったのですが、 別々のフォルダにあるにファイルを複数同時にアップロードするプログラムがわかりません。 どなたかご教示ください。よろしくお願いいたします。 using System; using System.Net; using System.IO; class FtpWebPut {  static void Main()  {   string uri = "ftp://servername/Upload/secret.png";   string myFile = "tmp.png";   WebRequest req = WebRequest.Create(uri);   req.Credentials = new NetworkCredential("user01", "mypassword");   req.Method = WebRequestMethods.Ftp.UploadFile;   using (Stream st = req.GetRequestStream())   using (FileStream fs = new FileStream(myFile, FileMode.Open))   {    Byte[] buf = new Byte[1024];    int count = 0;    do    {     count = fs.Read(buf, 0, buf.Length);     st.Write(buf, 0, count);    }    while (count != 0);   }  } }

  • p->next(ポインタ)的なことをC#で

    環境:VisualStudio2005 .Net C# FrameWork 2.0 プログラムを作成してみましたが、 どこが間違っているのかもわかりにくい上に 思うような結果が得られませんでした。 もっとスマートで美しい解法はないでしょうか。 お知恵をお貸しください。 --- No, Class, ChildNo, Status からなるクラス Info があり、 Info 型の配列 info には以下のデータが格納されているとします。 なお、PrimaryKey=No+Classで、配列 info は、No+Classの昇順に並んでいるとします。 class Info { byte no; byte class; byte childno; byte[] status= new byte[256]; public Info() { for (int i = 0; i < 256; i++) { this.status[i] = 0; } } } Info []info = new Info[8]; No,Class,ChildNo,Status 1, 1, 2, ___ 1, 2, 3, ___ 1, 3, 4, ___ 2, 1, 5, ___ 3, 1, 6, ___ 4, 1, 7, ___ 5, 1, 8, ___ 5, 2, 9, ___ まず、No=1,Class=1をキーとしてChildNo=2を取得し、 見つかったChildNoをNoとしNo=2,Class=1をキーとしてChildNo=5を取得、 次に、No=5,Class=1をキーとしてChildNo=8を取得、 次に、No=8,Class=1をキーとしてデータが見つからないので終了 最終的に、No=1,Class=1のStatusの[2][5][8]に1をセットしたいと思います(残りは0)。 同様に、No=2,Class=1からは5,8のデータを No=5,Class=1からは8のデータを取得したいです。 for (int i = 0; i < info[i].Length; i++) { Func(info[i].No, info[i].Class); } private byte Func(byte no, byte class) { byte cno = 0; byte tmpno = 0; byte ret = 0; for (int i = 0; i < info.Length; i++) { if (info[i].no == no && info[i].class == class) { cno = info[i].childno; tmpno = info[i].childno; info[i].status[childno] = 1; while ((ret = SetNearFlag(tmpno, class)) != 0) { info[i].status[ret] = 1; tmpno = ret; } info[i].status[tmpno] = 1; break; } } return cno; } よろしくお願いいたします。