使用python解析Java类

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的特点:

  1. 更好的错误提示:新版本的Python提供了更好的错误提示,能够更精确地指出代码中的问题。

  2. 更好的类型检查:Python 3.10引入了一些新特性,如参数标注、返回类型标注和泛型类型注解等,使类型检查更加准确。

  3. 更多的语言功能:Python 3.10提供了很多新的语言特性,如结构体、模式匹配、更好的枚举类型、更好的异步编程支持等。

  4. 更好的性能:Python 3.10引入了一些新的性能优化,使得Python代码的运行速度更快。

  5. 更好的库:Python 3.10中的一些标准库得到了更新和改进,例如asyncio库、zipapp库和zoneinfo库等。同时也有更多的第三方库可供使用。

  6. 更好的可读性:Python 3.10提供了一些新的语言特性和语法糖,使得代码更易读、更易维护。

python 的优点

Python 的优点包括:

  1. 简单易用:Python 的语法简单,易于学习和阅读,适合初学者。

  2. 面向对象:Python 支持面向对象编程,可以方便地实现复杂的软件架构。

  3. 丰富的库和框架:Python 有大量的第三方库和框架,可以大幅减少编写代码的时间,提高开发效率。

  4. 跨平台:Python 可以在多种操作系统上运行,包括 Windows、Linux、Mac OS 等。

  5. 解释型语言:Python 是一种解释型语言,可以快速调试和执行代码,而不需要编译。

  6. 垃圾回收机制:Python 自带的垃圾回收机制可以帮助开发者自动管理内存,避免内存泄漏等问题。

  7. 可扩展性:Python 支持 C/C++ 扩展,可以很方便地与其他语言交互,提高代码的灵活性和扩展性。

  8. 社区支持: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 方法来解析字符串,并得到一个语法树对象。接下来,它遍历语法树,找到所有的类和方法定义,并打印出类名和方法名。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘟嘟_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值