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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

Q&A

解決済

4回答

1508閲覧

javaで指定したソースコードファイルのクラス名などを取得したい

tamintya

総合スコア34

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

0グッド

0クリップ

投稿2021/11/09 08:13

前提・実現したいこと

指定したjavaソースコードファイルのクラス名、パッケージ宣言、importクラス名を取得するコードを書いているのですが
・FileReaderでファイルを読み込み、Character.compareで"c","l","a","s","s"などと順に比較していき、すべて等しかったら次の文字を空白まで読み格納する
という方法しか思いつかないのですがもっと便利な関数や書き方があるのでしょうか。

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

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

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

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

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

jimbe

2021/11/09 10:17

便利を求めるよりもまずやってみては如何でしょう。 公式ドキュメントの様々なクラスの説明を読んでみるというのも、意外なモノが見つかったり、今は役に立たなくても後日別の状況で「そういえばあの時なにか見たような」ということもある **かも** しれません。
m.ts10806

2021/11/09 11:03

「指定した」とはどのように指定するんでしょう。 ファイル名=クラス名になっているはずですし、そもそも作る目的は何ですか?
tamintya

2021/11/11 09:48

>便利を求めるよりもまずやってみては如何でしょう。 公式ドキュメントの様々なクラスの説明を読んでみるというのも、意外なモノが見つかったり、今は役に立たなくても後日別の状況で「そういえばあの時なにか見たような」ということもある **かも** しれません。 確かにそうですね。すこしずつですがクラスの説明等を読んでいきたいと思います。
tamintya

2021/11/11 09:51

>「指定した」とはどのように指定するんでしょう。 ファイル名=クラス名になっているはずですし、そもそも作る目的は何ですか? 前回幅探索のプログラムを製作したので、javaを始めたての頃に書いていた一つのファイルにclassを2つ以上書いていたプログラムを探すのにはどのようにしたらよいかと思ったからです。
tamintya

2021/11/11 09:52

>試していませんが、こんな記事を見つけました。ご参考までに。 ありがとうございます。
tamintya

2021/11/11 09:52

返信が遅くなってすみません。
jimbe

2021/11/11 09:58

作られているのは恐らく java の勉強がてらのご自分用のツールで、不特定多数に公開するような java のパーサを作るだとかではないのでしょうね。
tamintya

2021/11/12 08:12

>作られているのは恐らく java の勉強がてらのご自分用のツールで、不特定多数に公開するような java のパーサを作るだとかではないのでしょうね。 そうです。そのような場合はその旨を質問文に書いておいた方がよいのでしょうか。
jimbe

2021/11/12 08:43 編集

私個人としては、 teratail が「エンジニア特化」と謳っていますのは、質問する側も答える側もエンジニアという前提のことと考えています。 エンジニアの(最終)目的はクライアントに必要な機能を提供することであって、プログラム自体(java であれば "ほにゃららクラス" とか "ぺけぺけメソッド" とか)ではありません。ですので、質問は「目的を達成するための手段」としてのプログラムを作成する過程で発生した問題であって、目的が達成されるなら「質問中のプログラムで無くても良い」ということもあり得ます。 そういう意味では、プログラムを作られている背景が多少見えたほうが、質問の本質に近い回答が得やすいかもしれません。
guest

回答4

0

Javaでは標準ライブラリとして、ソースコードのパーサは提供されていないので、正規表現やScannerなどを利用して、ソースコードを解析してやる必要があります。

OSSのライブラリが利用できるのであれば、JavaParserなどがポピュラーかと思います。

投稿2021/11/09 11:40

neko_the_shadow

総合スコア2349

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

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

tamintya

2021/11/11 09:53

回答ありがとうございます。参考にさせていただきます。
guest

0

コメント。tamintya 2021/11/11 18:51

javaを始めたての頃に書いていた一つのファイルにclassを2つ以上書いていたプログラムを探すのにはどのようにしたらよいかと思ったからです。

てことは、だいだい、classって文字列が、何個あるかな~、と勘定できればいいわけですよね。だったら、プログラムなぞ書かずとも、WindowsであればSelect-String、Linuxであればgrepでだいたいのご用は足りるとおもいますけど。

頃に書いていたファイルのファイル名を、中身のクラス名に合わせて変更したい、クラスが複数あったらファイルを分割したい、とかいうのであれば、がんばって書いてください。

投稿2021/11/12 06:14

shiketa

総合スコア4061

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

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

0

ベストアンサー

java.util.Scanner を使って書いてみました。

java

1import java.util.Scanner; 2import java.util.ArrayList; 3import java.io.File; 4 5public class Main { 6 public static void main(String[] args) throws Exception { 7 String fname = "Main.java"; 8 Scanner sc = new Scanner(new File(fname)); 9 sc.useDelimiter("[^\w\.\"]+|\"[^\"]*\""); 10 ArrayList<String> c_name = new ArrayList<>(); 11 ArrayList<String> p_name = new ArrayList<>(); 12 ArrayList<String> i_name = new ArrayList<>(); 13 while (sc.hasNext()) { 14 String s = sc.next(); 15 if (s.equals("class")) c_name.add(sc.next()); 16 else if (s.equals("package")) p_name.add(sc.next()); 17 else if (s.equals("import")) i_name.add(sc.next()); 18 } 19 System.out.println("Class"); 20 for (String s : c_name) System.out.println(" " + s); 21 System.out.println("Package"); 22 for (String s : p_name) System.out.println(" " + s); 23 System.out.println("Import"); 24 for (String s : i_name) System.out.println(" " + s); 25 } 26}

コメントの中に class や import などがあると誤認識します。

追記
import で名前に * を含めるため、useDelimiter の引数を変更しました。また、
見つかった名前を ArrayList にため込まず、その場で表示するようにしました。

java

1//package abc.def.ghi 2 3import java.util.*; // List, Arrays, Scanner 4import java.io.File; 5 6public class Main { 7 public static void main(String[] args) throws Exception { 8 String fname = "Main.java"; 9 String[] sa = { "class", "package", "import" }; // string array 10 List<String> sl = Arrays.asList(sa); // string list 11 Scanner sc = new Scanner(new File(fname)); 12 sc.useDelimiter("[^\w.*\"]+|\"[^\"]*\""); 13 while (sc.hasNext()) { 14 String s = sc.next(); 15 if (sl.contains(s)) System.out.println(s + " : " + sc.next()); 16 } 17 } 18}

投稿2021/11/09 11:36

編集2021/11/12 06:03
kazuma-s

総合スコア8224

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

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

tamintya

2021/11/11 09:54

回答ありがとうございます。 上記のプログラムを実行するとwhile文が実行されないのですが何故なのでしょうか。
kazuma-s

2021/11/11 12:28

while文が実行されないとはどういう意味ですか? どの文まで実行されているのですか? fname にはどんなファイル名を指定しましたか? 結果が何も表示されないのですか?
tamintya

2021/11/12 08:21

始めのコードをもう一度試したところ、求めていた結果になりました。 お騒がせしてすみません。
kazuma-s

2021/11/12 08:27

コードは理解できたのでしょうか? 疑問点はないのでしょうか?
guest

0

java.util.Scanner でトークン毎に処理するのが楽かと思います。

投稿2021/11/09 09:17

int32_t

総合スコア21695

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

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

tamintya

2021/11/11 09:54

回答ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問