0x00 前言
遇到这样一个基础需求:
- 需要提取Java中的所有方法
- 需要过滤所有访问权限为public的方法。
0x01 提取Java中的方法
- 语言:python
- 库:javalang
直接使用pip install 安装即可。
直接提供解决方案,中间夹杂了很多测试过程,这里不进行记录。
使用parse模块直接读取,会读取到一个方法,这个方法中的types会存有所有类信息的列表。
tree = javalang.parse.parse(f.read())
如果是直解析一个类则可以直接选择types[0]
classs=tree.types[0]
获取到的classs同样包含了两类内容,一个是属性,还有一个是方法,每一个都对应了一个具体内容。我们使用classs.body进行获取
for i in classs.body:
这里我只想要读取到method,而不想要属性,选择取巧的方式,属性不具备body属性,所以可以先进行i.body,再进行异常抛出即可。
在method类中modifiers表示前缀,则可以直接使用in的方式挑出public属性的方法:
for i in classs.body:
try:
if "public" in i.modifiers:
i.body
print(i.name)
except Exception as e:
pass
最终解决方案如下:
import javalang
with open("cs.java","r",encoding='utf-8') as f:
tree = javalang.parse.parse(f.read())
classs=tree.types[0]
for i in classs.body:
try:
if "public" in i.modifiers:
i.body
print(i.name)
except Exception as e:
pass
效果如下:
补充知识
python
Python是一种高级动态编程语言,适用于各种任务,包括Web开发、数据分析、人工智能、科学计算和网络编程。
Python是一种易学易用的语言,它的语法简洁明了,代码可读性高,支持多种编程范式(面向对象、函数式、命令式)。
Python拥有强大的标准库和第三方库,可以大大降低编程难度,并且有一个庞大的社区,提供了各种工具和资源,可以帮助开发者轻松解决各种问题。
Python可以在多个平台上运行,包括Windows、Linux、MacOS、Unix等,这使得Python成为一种跨平台的语言。
总之,Python是一种功能强大、易学易用、开发效率高、应用广泛的编程语言。
python 3.10的特点
以下是Python 3.10的特点:
-
更好的错误提示:新版本的Python提供了更好的错误提示,能够更精确地指出代码中的问题。
-
更好的类型检查:Python 3.10引入了一些新特性,如参数标注、返回类型标注和泛型类型注解等,使类型检查更加准确。
-
更多的语言功能:Python 3.10提供了很多新的语言特性,如结构体、模式匹配、更好的枚举类型、更好的异步编程支持等。
-
更好的性能:Python 3.10引入了一些新的性能优化,使得Python代码的运行速度更快。
-
更好的库:Python 3.10中的一些标准库得到了更新和改进,例如asyncio库、zipapp库和zoneinfo库等。同时也有更多的第三方库可供使用。
-
更好的可读性:Python 3.10提供了一些新的语言特性和语法糖,使得代码更易读、更易维护。
python 的优点
Python 的优点包括:
-
简单易用:Python 的语法简单,易于学习和阅读,适合初学者。
-
面向对象:Python 支持面向对象编程,可以方便地实现复杂的软件架构。
-
丰富的库和框架:Python 有大量的第三方库和框架,可以大幅减少编写代码的时间,提高开发效率。
-
跨平台:Python 可以在多种操作系统上运行,包括 Windows、Linux、Mac OS 等。
-
解释型语言:Python 是一种解释型语言,可以快速调试和执行代码,而不需要编译。
-
垃圾回收机制:Python 自带的垃圾回收机制可以帮助开发者自动管理内存,避免内存泄漏等问题。
-
可扩展性:Python 支持 C/C++ 扩展,可以很方便地与其他语言交互,提高代码的灵活性和扩展性。
-
社区支持:Python 有一个庞大的开发者和用户社区,提供了大量的帮助、支持和资源。
javalang
javalang 是一个针对 Java 语言的解析库,它可以将 Java 源代码解析成 AST(抽象语法树),并提供方便的 API 来访问和操作 AST。
javalang 支持 Java 1.0 到 Java 12 的所有版本,并提供了丰富的 AST 节点类型,如 ClassDeclaration、MethodDeclaration、VariableDeclarator、Annotation 和 LambdaExpression 等。它还可以识别和解析注释,包括单行注释、多行注释和 Javadoc 注释。
javalang 可以帮助开发者编写 Java 代码分析工具、代码转换工具、代码生成工具等。例如,开发者可以使用 javalang 分析代码中使用的 API,或者自动移除代码中未使用的变量、方法等等。
javalang 的优点包括易于使用、开源、开发者友好、支持多版本和可扩展性强等特点。
Demo
这是一个 Python 的例子,使用 javalang
模块来解析 Java 代码并打印出类名和方法名:
import javalang
source = '''
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
'''
tree = javalang.parse.parse(source)
for path, node in tree:
if isinstance(node, javalang.tree.ClassDeclaration):
print("Class name: ", node.name)
elif isinstance(node, javalang.tree.MethodDeclaration):
print("Method name: ", node.name)
这个例子假设已经安装了 javalang
模块。它先定义了一个 Java 代码字符串,然后使用 javalang.parse.parse
方法来解析字符串,并得到一个语法树对象。接下来,它遍历语法树,找到所有的类和方法定义,并打印出类名和方法名。