質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

6954閲覧

クラス一覧を取得したい

mugichon

総合スコア61

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/05/08 11:31

自分のjarファイルの中に同梱している特定パッケージ配下のクラス一覧を取得したいと考えています。

現在以下のようなパッケージ構成でプログラムを組んでいます。

+デフォルト・パッケージ
Test.java
+function
A.java
B.java

Test.javaの中では、以下のように記述しています。

java

1public class Test { 2 public static void main(String[] args) { 3 4 } 5 public static void classlist() { 6 GetClassList cl = new GetClassList(); 7 List<String> ls=null; 8 try { 9 ls = cl.ClassList(); 10 for(String s:ls) { 11 String[] ss = s.split("functions."); 12 pclass(ss[1]); 13 System.out.println(""); 14 } 15 } catch (Exception e) { 16 e.printStackTrace(); 17 } 18 } 19 public static void pclass(String s) { 20 Class<?> cl; 21 Method method; 22 try { 23 cl = Class.forName("functions."+s.toUpperCase()); 24 method = cl.getMethod("Message"); 25 method.invoke(cl.newInstance()); 26 } catch (ClassNotFoundException | NoSuchMethodException | SecurityException |IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) { 27 e.printStackTrace(); 28 } 29 30 } 31 32}

GetClassList.javaは以下の通りです。

java

1public class GetClassList { 2 private static final String PK_NAME = "functions"; 3 public List<String> ClassList() throws Exception { 4 //ExecPath ep = new ExecPath(); 5 //xxxxxxxxxxxGetClassesInPackage ip = new xxxxxxxxxxxGetClassesInPackage(); 6 //ip.getClassesInPackage(PK_NAME); 7 //String eps=ep.ExecPath("ComTestTools"); 8 String packageName = PK_NAME; 9 List<Class<?>> classes = getClasses(packageName); 10 List<String> ls=new ArrayList<String>(); 11 for (Class<?> class1 : classes) { 12 //System.out.println(class1.getName()); 13 ls.add(class1.getName()); 14 } 15 return ls; 16 } 17 private static List<Class<?>> getClasses(String packageName) 18 throws IOException, URISyntaxException, ClassNotFoundException { 19 ClassLoader cl = Thread.currentThread().getContextClassLoader(); 20 Enumeration<URL> e = cl.getResources(packageName.replace(".", "/")); 21 List<Class<?>> classes = new ArrayList<>(); 22 for (; e.hasMoreElements();) { 23 URL url = e.nextElement(); 24 File dir = new File(url.getPath()); 25 for (String path : dir.list()) { 26 if (path.endsWith(".class")) { 27 classes.add(Class.forName(packageName + "." + path.substring(0, path.length() - 6))); 28 } 29 } 30 } 31 return classes; 32 } 33}

A.javaは以下の通りです。(ほぼB.javaも同じです)

java

1public class A{ 2 public void Message() { 3 String st= "テスト"; 4 System.out.println(st); 5 } 6}

上記コーディングでEclipse上で実行すると、A.java、B.javaのMessageが表示されるのですが、
なぜかjarファイル化してしまうと、上記メッセージが表示されませんでした。
(正確には、classすら見えていないようでした)

なぜEclipse上では表示できてjar化すると表示できなくなるのでしょうか。
また、どのようにしたらjar化しても参照することができるでしょうか。

すみませんが、よろしくお願いいたします。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

public static void main(String[] args) {

}

では何も実行されないと思います。

投稿2019/05/08 12:16

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugichon

2019/05/08 22:03

ご指摘ありがとうございます。 public static void main(String[] args) { classlist(); } でした。なかなか仕事でのコードでそのまま転記出来ずにミスりました。。
guest

0

ベストアンサー

A-pZさんのご指摘はまぁ質問者さんの質問のミス(実際に動かしたコードと違うコードを載せてしまった)のだろうと思いますが・・・

jarは単独のファイルの中にクラスファイルが含まれていますが一種のアーカイブとなっており、その内部の個々のリソース(概念的にはファイル)はjava.io.Fileクラスではアクセスできません。java.io.Fileが対象にできるのはOSのファイルシステムのディレクトリーと通常ファイルです。

アーカイブファイルの中にある抽象的なファイルツリーの中の特定のファイルまでをもFileクラスがアクセスできるという機能を持っているとそれはそれで面白い機能だと思いますが実際のFileクラスにそこまでの能力はないのです。アーカイブ中に存在する抽象的なディレクトリーをFileで表現することはできませんし、list()で一覧を取ることもできません。

アーカイブ形式であるjarファイルの構造をたどるにはFileではなくjava.util.jarパッケージのクラス群を使う必要があります。

つまりjarにパッケージングされていない状態でのパッケージ=>クラスのトラバースとjarにパッケージングされている状態での同様の処理は「別々の論理」で記述せねばなりません。

投稿2019/05/08 14:45

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugichon

2019/05/08 22:06

ご回答頂きありがとうございます。 なるほど、、Fileクラスではアクセスできないのですね。。 頂きましたjava.util.jarパッケージのクラスを使用して試行してみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問