サンプル集  >  Python  >  Javaのソースからクラス名、メソッド名を抽出
Javaのソースからクラス名、メソッド名を抽出
2025/09/15

Javaのソースからクラス名、メソッド名を抽出してみます。

◆環境
OS Windows 10 Home 22H2 64bit OS x64 プロセッサ
Python 3.13.1
VS Code 1.103.0

Javaの構文解析を行えるjavalangというライブラリをインストールします。

pip install javalang
Collecting javalang
  Downloading javalang-0.13.0-py3-none-any.whl.metadata (805 bytes)
Collecting six (from javalang)
  Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Downloading javalang-0.13.0-py3-none-any.whl (22 kB)
Downloading six-1.17.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, javalang
Successfully installed javalang-0.13.0 six-1.17.0

[notice] A new release of pip is available: 24.3.1 -> 25.2      
[notice] To update, run: python.exe -m pip install --upgrade pip

modifiersは{'static', 'public'}のように複数返される場合があるのでpublic、protected、privateだけ抽出するようにしました。 実行時にJavaのソースがあるフォルダ名を指定するようにします。

extract_class_methods.py
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
import javalang
import sys
from pathlib import Path

def proc_file(java_file):
    with open(java_file, encoding="utf-8") as f:
        tree = javalang.parse.parse(f.read())

    results = []
    for path, class_decl \
     in tree.filter(javalang.tree.ClassDeclaration):
        class_name = class_decl.name
        for method in class_decl.methods:
            mods = method.modifiers
            if 'public' in mods:
                scope = 'public'
            elif 'protected' in mods:
                scope = 'protected'
            elif 'private' in mods:
                scope = 'private'
            else:
                scope = 'package-private'
            results.append([java_file
                          , class_name
                          , scope
                          , method.name
                          ])
    return results

args = sys.argv
root_dir = Path(args[1])
rows = []
for file in root_dir.rglob("*.java"):
    rows.extend(proc_file(file))

for row in rows:
    print(f"{row[0]},{row[1]},{row[2]},{row[3]}")

実行してみます。

py .\extract_class_methods.py src        
src\FileCopyBase.java,FileCopyBase,public,fileCopy
src\FileCopyBase.java,FileCopyBase,protected,procLine
src\FileCopyBase.java,FileCopyBase,public,getInFileName
src\FileCopyBase.java,FileCopyBase,public,getInFileLength
src\FileCopyBase.java,FileCopyBase,public,getOutFileName
src\FileCopyBase.java,FileCopyBase,public,getOutFileLength
src\JSrc2HTMLTest.java,JSrc2HTMLTest,public,main
src\orgSplit.java,orgSplit,public,main
src\orgSplit.java,orgSplit,private,orgSplit

期待通りに動作しました。

▲ PageTop  ■ Home


Copyright (C) 2025 ymlib.com