CN113010175A - 匿名函数的信息获取方法、装置、设备及可读存储介质 - Google Patents

匿名函数的信息获取方法、装置、设备及可读存储介质 Download PDF

Info

Publication number
CN113010175A
CN113010175A CN201911320658.XA CN201911320658A CN113010175A CN 113010175 A CN113010175 A CN 113010175A CN 201911320658 A CN201911320658 A CN 201911320658A CN 113010175 A CN113010175 A CN 113010175A
Authority
CN
China
Prior art keywords
function
constant pool
bytecode
information
anonymous
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201911320658.XA
Other languages
English (en)
Inventor
姜凡
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201911320658.XA priority Critical patent/CN113010175A/zh
Publication of CN113010175A publication Critical patent/CN113010175A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • G06F8/434Pointers; Aliasing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2282Tablespace storage structures; Management thereof

Abstract

本申请公开了一种匿名函数的信息获取方法、装置、设备及可读存储介质,涉及程序设计领域。该方法包括:获取字节码文件,其中包括引导函数和字节码常量池;从字节码常量池中获取匿名函数的函数信息,得到常量池索引与函数信息之间的第一对应关系;获取动态字节码指令;从字节码常量池中获取与接口信息描述符对应的接口信息,得到属性表索引和接口信息的第二对应关系;结合第一对应关系和第二对应关系,得到匿名函数的信息。通过引导函数从字节码常量池中获取函数信息,并通过动态字节码指令,从字节码常量池中获取接口信息,通过常量池索引和属性表索引将函数信息和接口信息建立对应关系,从而得到Lambda表达式匿名函数的上下文信息。

Description

匿名函数的信息获取方法、装置、设备及可读存储介质
技术领域
本申请实施例涉及程序设计领域,特别涉及一种匿名函数的信息获取方法、 装置、设备及可读存储介质。
背景技术
匿名函数是一种无需显式的定义即可进行传入的函数形式,该匿名函数在 应用过程中包含一个表达式,该表达式中无需对该匿名函数的名称进行定义, 而是直接使用匿名函数表达式,将匿名函数赋值给一个变量,从而实现该匿名 函数的功能,示意性的,该匿名函数表达式包括Lambda表达式。
相关技术中,以安卓开发中实现点击监听的接口为例进行说明,通常通过 基于匿名内部类的方式实现该点击监听的接口,匿名内部类中包含了接口类名 和函数名等信息,可以直接获取该匿名内部类的上下文信息进行识别定位,实 现点击监听。
然而,当需要对上述点击监听的接口通过Lambda表达式实现时,由于在 Lambda表达式中,接口类名和函数名都属于未知状态,无法直接识别,故也无 法实现上述点击监听的接口。
发明内容
本申请实施例提供了一种匿名函数的信息获取方法、装置、设备及可读存 储介质,可以得到Lambda表达式匿名函数的上下文信息,实现对该匿名函数的 应用。所述技术方案如下:
一方面,提供了一种匿名函数的信息获取方法,所述方法包括:
获取字节码文件,所述字节码文件为含有所述匿名函数的源码文件在编译 后生成的文件,所述字节码文件中包括引导函数和字节码常量池,所述引导函 数中包括常量池索引;
从所述字节码常量池中获取与所述常量池索引对应的所述匿名函数的函数 信息,得到所述常量池索引与所述函数信息之间的第一对应关系,所述函数信 息中包括所述匿名函数的函数名;
获取动态字节码指令,所述动态字节码指令中包括所述属性表索引和接口 信息描述符,所述属性表索引用于索引至对应的所述引导函数;
从所述字节码常量池中获取与所述接口信息描述符对应的所述接口信息, 得到所述属性表索引和所述接口信息的第二对应关系;
结合所述第一对应关系和所述第二对应关系,得到所述匿名函数的信息。
另一方面,提供了一种匿名函数的信息获取装置,所述装置包括:
获取模块,用于获取字节码文件,所述字节码文件为含有所述匿名函数的 源码文件在编译后生成的文件,所述字节码文件中包括引导函数和字节码常量 池,所述引导函数中包括常量池索引;
所述获取模块,还用于从所述字节码常量池中获取与所述常量池索引对应 的所述匿名函数的函数信息,得到所述常量池索引与所述函数信息之间的第一 对应关系,所述函数信息中包括所述匿名函数的函数名;
所述获取模块,还用于获取动态字节码指令,所述动态字节码指令中包括 所述常量池索引和接口信息描述符;
所述获取模块,还用于从所述字节码常量池中获取与所述接口信息描述符 对应的所述接口信息,得到所述常量池索引和所述接口信息的第二对应关系;
确定模块,用于结合所述第一对应关系和所述第二对应关系,得到所述匿 名函数的信息。
在一个可选的实施例中,所述获取模块,还用于从所述字节码常量池中获 取与所述常量池索引对应的方法句柄指针,所述方法句柄指针用于指向所述字 节码常量池中的内容;通过所述方法句柄指针的指示,从所述字节码常量池中 获取所述匿名函数的所述函数信息。
在一个可选的实施例中,所述字节码文件中包括引导函数属性表;
所述获取模块,包括:
遍历单元,用于对所述引导函数属性表进行遍历,得到所述引导函数;
获取单元,用于从所述引导函数中获取所述常量池索引。
在一个可选的实施例中,所述获取模块,还用于以所述常量池索引为关键 字,以所述函数信息为值,得到所述常量池索引与所述函数信息之间的键值对 作为所述第一对应关系。
在一个可选的实施例中,所述函数信息中还包括所述匿名函数的函数签名, 以及所述匿名函数所属类名中的至少一种。
在一个可选的实施例中,所述匿名函数为Lambda表达式表达的函数;
所述获取模块,包括:
遍历单元,用于对所述字节码常量池进行遍历,得到所述字节码常量池中 的所述动态字节码指令,其中,每个Lambda表达式对应一个所述动态字节码指 令。
在一个可选的实施例中,所述接口信息中包括接口类名和接口函数名中的 至少一种。
另一方面,提供了一种计算机设备,所述计算机设备包括处理器和存储器, 所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至 少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执 行以实现如上述本申请实施例中任一所述的匿名函数的信息获取方法。
另一方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少 一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一 段程序、所述代码集或指令集由所述处理器加载并执行以实现如上述本申请实 施例中任一所述的匿名函数的信息获取方法。
另一方面,提供了一种计算机程序产品,当所述计算机程序产品在计算机 上运行时,使得计算机执行如上述本申请实施例中任一所述的匿名函数的信息 获取方法。
本申请实施例提供的技术方案带来的有益效果至少包括:
通过字节码文件中的引导函数和字节码常量池,根据引导函数从字节码常 量池中获取函数信息,并通过动态字节码指令,从字节码常量池中获取接口信 息,根据常量池索引和属性表索引将函数信息和接口信息建立对应关系,从而 得到Lambda表达式匿名函数的上下文信息,实现对该匿名函数的应用。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所 需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请 的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下, 还可以根据这些附图获得其他的附图。
图1是本申请一个示例性实施例提供的匿名函数的信息获取方法的流程图;
图2是本申请另一个示例性实施例提供的匿名函数的信息获取方法的流程 图;
图3是本申请一个示例性实施例提供的匿名函数的函数信息获取架构示意 图;
图4是本申请另一个示例性实施例提供的匿名函数的信息获取方法的流程 图;
图5是本申请一个示例性实施例提供的匿名函数的信息获取装置的结构框 图;
图6是本申请另一个示例性实施例提供的匿名函数的信息获取装置的结构 框图;
图7是本申请一个示例性的实施例提供的终端的结构框图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请 实施方式作进一步地详细描述。
首先,对本申请中涉及的名词进行简单介绍:
匿名函数:是指编程过程中一种函数定义的简写形式,在该匿名函数的使 用过程中,无需定义函数名,仅需对赋值关系或事件的触发进行确定,即可实 现对该匿名函数的应用。示意性的,该匿名函数形如:vara=function(){return 1};该匿名函数未定义函数名,并向变量a进行赋值。由于匿名函数无需定义函 数名,故不存在函数名冲突。
Lambda表达式:又称为闭包,是匿名函数的一种编写方法,在Java8之前, Java仅有匿名类的写法,而不支持匿名函数的写法,Java8为Java语言开发的一个 版本,其支持以Lambda表达式编写匿名函数。示意性的,该Lambda表达式的语 法格式如:(parameters)->expression;或(parameters)->{statements;},其 中,parameters表示参数,当仅有一个参数时,无需定义,而存在多个参数时, 需要定义;expression和{statements;}表示主体,当主体包含语句时,则无需使 用大括号,当主体只有一个表达式返回值则编译器自动返回值,大括号内需要 指定表达式返回了数值的状态。
面向切面编程(Aspect Oriented Programming,AOP):是指通过预编译方式 和运行期动态代理实现程序功能的一种技术,可选地,该AOP技术主要用于日 志记录、性能统计、安全控制、事务处理、异常处理等功能中,将日志记录、 性能统计、安全控制、事务处理、异常处理等代码从业务逻辑代码中分离出来, 也即,针对业务处理过程中的切面进行提取,以获得逻辑过程中各部分之间低 耦合性的隔离效果。
Java字节码类库(Java programming Assistant,Javassist):是在Java中编辑字节码的类库,使Java程序能够在运行时定义一个新类,Javassist是一个高层的Java 字节码处理类库,能够运行时动态生成类,修改类。
可选地,在Java8中引入了Lambda表达式后,开发人员在编程过程中越来越 多的使用该Lambda表达式进行编程,然而,在基于Javassist的AOP方案中,由于 匿名函数的接口名和函数名都属于未知状态,故无法对该匿名函数进行识别, 从而也无法实现函数中的AOP处理。
结合上述名词简介,对本申请书实施例中提供的匿名函数的信息获取方法 进行说明,图1是本申请一个示例性实施例提供的匿名函数的信息获取方法的流 程图,以该方法应用于终端中为例进行说明,如图1所示,该方法包括:
步骤101,获取字节码文件,该字节码文件为含有匿名函数的源码文件在编 译后生成的文件,该字节码文件中包括引导函数和字节码常量池。
可选地,该引导函数中包括常量池索引。
可选地,该匿名函数为Lambda表达式表达的函数。
可选地,本申请实施例中,以上述源码文件为Java源文件为例进行说明,该 字节码文件为Java源文件在经过编译后生成的文件,根据Java虚拟机(Java Virtual Machine,JVM)规范规定,含有Lambda表达式的Java源文件,经过编译后生成 的字节码文件中,会在属性表集合中增加引导函数(英文:Bootstrap Methods) 属性表,该引导函数属性表中包括至少一个引导函数,该引导函数中包括方法 句柄的常量池索引。
可选地,该引导函数属性表中描述了至少一个Lambda表达式,通过遍历引 导函数属性表即可得到Java源文件中的Lambda表达式的信息。
可选地,在对Java源文件进行编译后,生成字节码文件,该字节码文件中包 括属性表集合,该属性表集合中包括至少一个属性表,其中包括引导函数属性 表,该引导函数属性表中包括至少一个引导函数,每个引导函数中包括方法句 柄的常量池索引。
步骤102,从字节码常量池中获取与常量池索引对应的匿名函数的函数信息, 得到常量池索引与函数信息之间的第一对应关系。
可选地,该函数信息中包括匿名函数的函数名。可选地,该函数信息中还 包括匿名函数的函数签名,以及匿名函数所属类名中的至少一种。
可选地,通过该常量池索引在该字节码常量池中进行索引,得到匿名函数 的函数信息,建立该常量池索引与函数信息之间的第一对应关系。
可选地,通过常量池索引在字节码常量池中索引得到的,为与该常量池索 引对应的方法句柄(英文:MethodHandle),通过该方法句柄能够从字节码常量 池中获取匿名函数的函数信息。
可选地,以键值对(英文:key-value)形式对该常量池索引与函数信息之 间的对应关系进行存储,其中,常量池索引为key,匿名函数的函数信息为value。
步骤103,获取动态字节码指令,该动态字节码指令中包括属性表索引和接 口信息描述符。
可选地,该属性表索引用于索引至对应的引导函数,也即通过该属性表索 引,能够与引导函数中的常量池索引进行一一对应。
可选地,该属性表索引也可以直接实现为上述常量池索引,也即,直接通 过常量池索引将接口信息与函数信息进行对应。
可选地,为了更好地支持动态类型语言,JVM规范增加了动态字节码指令invokedynamic,该动态字节码指令为Lambda表达式实现的基础。
可选地,通过对字节码常量池进行遍历,即可得到该字节码常量池中所有 的动态字节码指令,可选地,每个动态字节码指令对应一个Lambda表达式。
可选地,字节码文件中包括引导函数属性表,该属性表索引用于索引至该 引导函数属性表中的引导函数,从而与该引导函数中的常量池索引进行匹配。 可选地,由于该常量池索引对应索引得到字节码常量池中的函数信息,故该属 性表索引能够确定与该函数信息之间的匹配关系。
可选地,该接口信息描述符(英文:NameAndTypeInfo)给出字段或方法的 名称和描述符,通过该接口信息描述符能够确定一个字段或者方法。
步骤104,从字节码常量池中获取与接口信息描述符对应的接口信息,得到 属性表索引和接口信息的第二对应关系。
可选地,通过该接口信息描述符,即可从字节码常量池中获取匿名函数的 接口信息,如:该匿名函数所实现的接口类型和接口函数名等。
可选地,通过该属性表索引能够索引至引导函数属性表中的引导函数,并 从而对应匹配至该引导函数中的常量池索引,故在通过接口信息描述符得到接 口信息后,能够得到该接口信息与常量池索引之间的对应关系。
步骤105,结合第一对应关系和第二对应关系,得到匿名函数的信息。
可选地,该第一对应关系包括常量池索引与函数信息之间的对应关系,通 过上述第二对应关系,通过属性表索引至引导函数属性表中的引导函数后,建 立属性表索引与引导函数中常量池索引之间的对应关系,从而得到常量池索引 与接口信息之间的对应关系,也即第一对应关系包括常量池索引与函数信息之 间的对应关系,而第二对应关系包括常量池索引与接口信息之间的对应关系, 从而通过常量池索引将函数信息与接口信息对应起来,得到匿名函数的上下文 信息。
可选地,通过获取该匿名函数的上下文信息,即可对该匿名函数进行后续 应用,如:AOP处理。
综上所述,本实施例提供的匿名函数的信息获取方法,通过字节码文件中 的引导函数和字节码常量池,根据引导函数从字节码常量池中获取函数信息, 并通过动态字节码指令,从字节码常量池中获取接口信息,根据常量池索引和 属性表索引将函数信息和接口信息建立对应关系,从而得到Lambda表达式匿名 函数的上下文信息,实现对该匿名函数的应用。
在一个可选的实施例中,上述函数信息在获取时,通过索引得到方法句柄 实现,图2是本申请另一个示例性实施例提供的匿名函数的信息获取方法的流 程图,以该方法应用于终端中为例进行说明,如图2所示,该方法包括:
步骤201,获取字节码文件,该字节码文件为含有匿名函数的源码文件在编 译后生成的文件,该字节码文件中包括引导函数和字节码常量池。
可选地,该引导函数中包括常量池索引。
可选地,该匿名函数为Lambda表达式表达的函数。
可选地,在对Java源文件进行编译后,生成字节码文件,该字节码文件中包 括属性表集合,该属性表集合中包括至少一个属性表,其中包括引导函数属性 表,该引导函数属性表中包括至少一个引导函数,每个引导函数中包括方法句 柄的常量池索引。
步骤202,从字节码常量池中获取与常量池索引对应的方法句柄指针。
可选地,该字节码文件中包括引导函数属性表,首先对引导函数属性表进 行遍历,得到该引导函数属性表中的所有引导函数,并从引导函数中获取常量 池索引,每个引导函数中都包含一个方法句柄的常量池索引,从而从字节码常 量池中获取与该常量池索引对应的方法句柄指针。
可选地,该方法句柄指针用于指向字节码常量池中的内容。
可选地,方法句柄为Java中为间接调用方法引入的应用程序编程接口(Application Programming Interface,API),该方法句柄中包括两个类: MethodHandle和MethodType,其中,MethodType用于描述方法的返回值类型 以及入参类型,MethodHandle包括一个指向对象的指针,可选地,本申请实施 例中,以该方法句柄中包括MethodHandle指针为例进行说明,也即,通过该常 量池索引,能够从字节码常量池中查询到MethodHandle指针。
步骤203,通过方法句柄指针的指示,从字节码常量池中获取匿名函数的函 数信息,得到常量池索引与函数信息之间的第一对应关系。
可选地,该方法句柄指针指向该字节码常量池中的内容,通过该方法句柄 指针的指示,从字节码常量池中得到该方法句柄指针所指向的内容,也即该匿 名函数的函数信息。
可选地,该函数信息中包括匿名函数的函数名。可选地,该函数信息中还 包括匿名函数的函数签名,以及匿名函数所属类名中的至少一种。
可选地,由于该方法句柄指针为通过常量池索引得到的指针,而该匿名函 数的函数信息为方法句柄指针所指向的内容,故,得到常量池索引与该函数信 息之间的第一对应关系。
步骤204,获取动态字节码指令,该动态字节码指令中包括属性表索引和接 口信息描述符。
可选地,该属性表索引用于索引至对应的引导函数,也即通过该属性表索 引,能够与引导函数中的常量池索引进行一一对应。
可选地,通过对字节码常量池进行遍历,即可得到该字节码常量池中所有 的动态字节码指令,可选地,每个动态字节码指令对应一个Lambda表达式。
可选地,字节码文件中包括引导函数属性表,该属性表索引用于索引至该 引导函数属性表中的引导函数,从而与该引导函数中的常量池索引进行匹配。
步骤205,从字节码常量池中获取与接口信息描述符对应的接口信息,得到 属性表索引和接口信息的第二对应关系。
可选地,通过该接口信息描述符,即可从字节码常量池中获取匿名函数的 接口信息,可选地,该接口信息包括匿名函数所实现的接口类型和接口函数名 中的至少一种。
步骤206,结合第一对应关系和第二对应关系,得到匿名函数的信息。
可选地,该第一对应关系包括常量池索引与函数信息之间的对应关系,通 过上述第二对应关系,通过属性表索引至引导函数属性表中的引导函数后,建 立属性表索引与引导函数中常量池索引之间的对应关系,从而得到常量池索引 与接口信息之间的对应关系,也即第一对应关系包括常量池索引与函数信息之 间的对应关系,而第二对应关系包括常量池索引与接口信息之间的对应关系, 从而通过常量池索引将函数信息与接口信息对应起来,得到匿名函数的上下文 信息。
综上所述,本实施例提供的匿名函数的信息获取方法,通过字节码文件中 的引导函数和字节码常量池,根据引导函数从字节码常量池中获取函数信息, 并通过动态字节码指令,从字节码常量池中获取接口信息,根据常量池索引和 属性表索引将函数信息和接口信息建立对应关系,从而得到Lambda表达式匿名 函数的上下文信息,实现对该匿名函数的应用。
本实施例中提供的方法,首先根据常量池索引从字节码常量池中获取方法 句柄指针,从而根据方法句柄指针从字节码常量池中获取匿名函数的函数信息, 并通过动态字节码指令,从字节码常量池中获取接口信息,通过常量池索引和 属性表索引将函数信息和接口信息建立对应关系,从而得到Lambda表达式匿名 函数的上下文信息,实现对该匿名函数的应用。
示意性的,该匿名函数的函数信息获取架构如图3所示:
首先获取字节码文件310,该字节码文件310中包括属性表集合320和字节 码常量池330,其中,属性表集合320中包括引导函数属性表340,引导函数属 性表340中包括至少一个引导函数350,该引导函数350中包括常量池索引351, 通过该常量池索引351能够从字节码常量池330中索引得到匿名函数的函数信 息360,该函数信息360包括匿名函数的函数名361、函数签名362和所属类名 363;
字节码常量池330中包括动态字节码指令370,该动态字节码指令370中包 括属性表索引371和接口信息描述符372,通过该接口信息描述符372从字节码 常量池330中获取得到该匿名函数的接口信息380,该接口信息380中包括匿名 函数的接口类名381和接口函数名382。
其中,动态字节码指令370中的属性表索引371与引导函数350中的常量 池索引351一一对应,该属性表索引371可以索引至引导函数属性表340中的 引导函数350,从而与常量池索引351对应;或,该属性表索引371与常量池索 引351可以实现为同样的索引,本申请实施例对此不加以限定。
在一个可选的实施例中,上述匿名函数为Lambda表达式表达的函数,图4 是本申请另一个示例性实施例提供的匿名函数的信息获取方法的流程图,以该 方法应用于终端中为例进行说明,如图4所示,该方法包括:
步骤401,获取字节码文件,该字节码文件为含有匿名函数的源码文件在编 译后生成的文件,该字节码文件中包括引导函数和字节码常量池。
可选地,该引导函数中包括常量池索引。
可选地,该匿名函数为Lambda表达式表达的函数。
可选地,在对Java源文件进行编译后,生成字节码文件,该字节码文件中包 括属性表集合,该属性表集合中包括至少一个属性表,其中包括引导函数属性 表,该引导函数属性表中包括至少一个引导函数,每个引导函数中包括方法句 柄的常量池索引。
步骤402,从字节码常量池中获取与常量池索引对应的方法句柄指针。
可选地,方法句柄为Java中为间接调用方法引入的应用程序编程接口(Application Programming Interface,API),该方法句柄中包括两个类: MethodHandle和MethodType,其中,MethodType用于描述方法的返回值类型 以及入参类型,MethodHandle包括一个指向对象的指针,可选地,本申请实施 例中,以该方法句柄中包括MethodHandle指针为例进行说明,也即,通过该常 量池索引,能够从字节码常量池中查询到MethodHandle指针。
步骤403,通过方法句柄指针的指示,从字节码常量池中获取匿名函数的函 数信息。
可选地,该方法句柄指针指向该字节码常量池中的内容,通过该方法句柄 指针的指示,从字节码常量池中得到该方法句柄指针所指向的内容,也即该匿 名函数的函数信息。
可选地,该函数信息中包括匿名函数的函数名。可选地,该函数信息中还 包括匿名函数的函数签名,以及匿名函数所属类名中的至少一种。
步骤404,以常量池索引为关键字,以函数信息为值,得到常量池索引与函 数信息之间的键值对作为第一对应关系。
可选地,由于该方法句柄指针为通过常量池索引得到的指针,而该匿名函 数的函数信息为方法句柄指针所指向的内容,故,得到常量池索引与该函数信 息之间的第一对应关系。
可选地,以键值对(英文:key-value)形式对该常量池索引与函数信息之 间的第一对应关系进行存储,其中,常量池索引为关键字key,匿名函数的函数 信息为值value。
步骤405,对字节码常量池进行遍历,得到字节码常量池中的动态字节码指 令,该动态字节码指令中包括属性表索引和接口信息描述符。
可选地,每个动态字节码指令对应一个Lambda表达式。
可选地,字节码文件中包括引导函数属性表,该属性表索引用于索引至该 引导函数属性表中的引导函数,从而与该引导函数中的常量池索引进行匹配。
步骤406,从字节码常量池中获取与接口信息描述符对应的接口信息,得到 属性表索引和接口信息的第二对应关系。
可选地,通过该接口信息描述符,即可从字节码常量池中获取匿名函数的 接口信息,可选地,该接口信息包括匿名函数所实现的接口类型和接口函数名 中的至少一种。
步骤407,结合第一对应关系和第二对应关系,得到匿名函数的信息。
可选地,该第一对应关系包括常量池索引与函数信息之间的对应关系,通 过上述第二对应关系,通过属性表索引至引导函数属性表中的引导函数后,建 立属性表索引与引导函数中常量池索引之间的对应关系,从而得到常量池索引 与接口信息之间的对应关系,也即第一对应关系包括常量池索引与函数信息之 间的对应关系,而第二对应关系包括常量池索引与接口信息之间的对应关系, 从而通过常量池索引将函数信息与接口信息对应起来,得到匿名函数的上下文 信息。
综上所述,本实施例提供的匿名函数的信息获取方法,通过字节码文件中 的引导函数和字节码常量池,根据引导函数从字节码常量池中获取函数信息, 并通过动态字节码指令,从字节码常量池中获取接口信息,根据常量池索引和 属性表索引将函数信息和接口信息建立对应关系,从而得到Lambda表达式匿名 函数的上下文信息,实现对该匿名函数的应用。
图5是本申请一个示例性实施例提供的匿名函数的信息获取装置的结构框 图,以该装置应用于终端中为例进行说明,如图5所示,该装置包括:获取模 块510和确定模块520;
获取模块510,用于获取字节码文件,所述字节码文件为含有所述匿名函数 的源码文件在编译后生成的文件,所述字节码文件中包括引导函数和字节码常 量池,所述引导函数中包括常量池索引;
所述获取模块510,还用于从所述字节码常量池中获取与所述常量池索引对 应的所述匿名函数的函数信息,得到所述常量池索引与所述函数信息之间的第 一对应关系,所述函数信息中包括所述匿名函数的函数名;
所述获取模块510,还用于获取动态字节码指令,所述动态字节码指令中包 括所述常量池索引和接口信息描述符;
所述获取模块510,还用于从所述字节码常量池中获取与所述接口信息描述 符对应的所述接口信息,得到所述常量池索引和所述接口信息的第二对应关系;
确定模块520,用于结合所述第一对应关系和所述第二对应关系,得到所述 匿名函数的信息。
在一个可选的实施例中,所述获取模块510,还用于从所述字节码常量池中 获取与所述常量池索引对应的方法句柄指针,所述方法句柄指针用于指向所述 字节码常量池中的内容;通过所述方法句柄指针的指示,从所述字节码常量池 中获取所述匿名函数的所述函数信息。
在一个可选的实施例中,所述字节码文件中包括引导函数属性表;
如图6所示,所述获取模块510,包括:
遍历单元511,用于对所述引导函数属性表进行遍历,得到所述引导函数;
获取单元512,用于从所述引导函数中获取所述常量池索引。
在一个可选的实施例中,所述获取模块510,还用于以所述常量池索引为关 键字,以所述函数信息为值,得到所述常量池索引与所述函数信息之间的键值 对作为所述第一对应关系。
在一个可选的实施例中,所述函数信息中还包括所述匿名函数的函数签名, 以及所述匿名函数所属类名中的至少一种。
在一个可选的实施例中,所述匿名函数为Lambda表达式表达的函数;
所述获取模块510,包括:
遍历单元511,用于对所述字节码常量池进行遍历,得到所述字节码常量池 中的所述动态字节码指令,其中,每个Lambda表达式对应一个所述动态字节码 指令。
在一个可选的实施例中,所述接口信息中包括接口类名和接口函数名中的 至少一种。
综上所述,本实施例提供的匿名函数的信息获取装置,通过字节码文件中 的引导函数和字节码常量池,根据引导函数从字节码常量池中获取函数信息, 并通过动态字节码指令,从字节码常量池中获取接口信息,根据常量池索引和 属性表索引将函数信息和接口信息建立对应关系,从而得到Lambda表达式匿名 函数的上下文信息,实现对该匿名函数的应用。
需要说明的是:上述实施例提供的匿名函数的信息获取装置,仅以上述各 功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配 由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成 以上描述的全部或者部分功能。另外,上述实施例提供的匿名函数的信息获取 装置与匿名函数的信息获取方法实施例属于同一构思,其具体实现过程详见方 法实施例,这里不再赘述。
图7示出了本发明一个示例性实施例提供的终端700的结构框图。该终端 700可以是:智能手机、平板电脑、MP3播放器(Moving Picture Experts Group Audio Layer III,动态影像专家压缩标准音频层面3)、MP4(Moving Picture Experts Group Audio LayerIV,动态影像专家压缩标准音频层面4)播放器、笔 记本电脑或台式电脑。终端700还可能被称为用户设备、便携式终端、膝上型 终端、台式终端等其他名称。
通常,终端700包括有:处理器701和存储器702。
处理器701可以包括一个或多个处理核心,比如4核心处理器、8核心处理 器等。处理器701可以采用DSP(Digital Signal Processing,数字信号处理)、FPGA (Field-Programmable Gate Array,现场可编程门阵列)、PLA(Programmable Logic Array,可编程逻辑阵列)中的至少一种硬件形式来实现。处理器701也可 以包括主处理器和协处理器,主处理器是用于对在唤醒状态下的数据进行处理 的处理器,也称CPU(Central ProcessingUnit,中央处理器);协处理器是用于 对在待机状态下的数据进行处理的低功耗处理器。在一些实施例中,处理器701 可以在集成有GPU(Graphics Processing Unit,图像处理器),GPU用于负责显 示屏所需要显示的内容的渲染和绘制。一些实施例中,处理器701还可以包括 AI(Artificial Intelligence,人工智能)处理器,该AI处理器用于处理有关机器 学习的计算操作。
存储器702可以包括一个或多个计算机可读存储介质,该计算机可读存储 介质可以是非暂态的。存储器702还可包括高速随机存取存储器,以及非易失 性存储器,比如一个或多个磁盘存储设备、闪存存储设备。在一些实施例中, 存储器702中的非暂态的计算机可读存储介质用于存储至少一个指令,该至少 一个指令用于被处理器701所执行以实现本申请中方法实施例提供的匿名函数 的信息获取方法。
在一些实施例中,终端700还可选包括有:外围设备接口703和至少一个 外围设备。处理器701、存储器702和外围设备接口703之间可以通过总线或信 号线相连。各个外围设备可以通过总线、信号线或电路板与外围设备接口703 相连。具体地,外围设备包括:射频电路704、触摸显示屏705、摄像头706、 音频电路707、定位组件708和电源709中的至少一种。
外围设备接口703可被用于将I/O(Input/Output,输入/输出)相关的至少 一个外围设备连接到处理器701和存储器702。在一些实施例中,处理器701、 存储器702和外围设备接口703被集成在同一芯片或电路板上;在一些其他实 施例中,处理器701、存储器702和外围设备接口703中的任意一个或两个可以 在单独的芯片或电路板上实现,本实施例对此不加以限定。
射频电路704用于接收和发射RF(Radio Frequency,射频)信号,也称电 磁信号。射频电路704通过电磁信号与通信网络以及其他通信设备进行通信。 射频电路704将电信号转换为电磁信号进行发送,或者,将接收到的电磁信号 转换为电信号。可选地,射频电路704包括:天线系统、RF收发器、一个或多 个放大器、调谐器、振荡器、数字信号处理器、编解码芯片组、用户身份模块 卡等等。射频电路704可以通过至少一种无线通信协议来与其它终端进行通信。 该无线通信协议包括但不限于:万维网、城域网、内联网、各代移动通信网络 (2G、3G、4G及5G)、无线局域网和/或WiFi(Wireless Fidelity,无线保真)网 络。在一些实施例中,射频电路704还可以包括NFC(Near Field Communication, 近距离无线通信)有关的电路,本申请对此不加以限定。
显示屏705用于显示UI(User Interface,用户界面)。该UI可以包括图形、 文本、图标、视频及其它们的任意组合。当显示屏705是触摸显示屏时,显示 屏705还具有采集在显示屏705的表面或表面上方的触摸信号的能力。该触摸 信号可以作为控制信号输入至处理器701进行处理。此时,显示屏705还可以 用于提供虚拟按钮和/或虚拟键盘,也称软按钮和/或软键盘。在一些实施例中, 显示屏705可以为一个,设置终端700的前面板;在另一些实施例中,显示屏 705可以为至少两个,分别设置在终端700的不同表面或呈折叠设计;在再一些 实施例中,显示屏705可以是柔性显示屏,设置在终端700的弯曲表面上或折 叠面上。甚至,显示屏705还可以设置成非矩形的不规则图形,也即异形屏。 显示屏705可以采用LCD(Liquid Crystal Display,液晶显示屏)、OLED(Organic Light-Emitting Diode,有机发光二极管)等材质制备。
摄像头组件706用于采集图像或视频。可选地,摄像头组件706包括前置 摄像头和后置摄像头。通常,前置摄像头设置在终端的前面板,后置摄像头设 置在终端的背面。在一些实施例中,后置摄像头为至少两个,分别为主摄像头、 景深摄像头、广角摄像头、长焦摄像头中的任意一种,以实现主摄像头和景深 摄像头融合实现背景虚化功能、主摄像头和广角摄像头融合实现全景拍摄以及 VR(Virtual Reality,虚拟现实)拍摄功能或者其它融合拍摄功能。在一些实施 例中,摄像头组件706还可以包括闪光灯。闪光灯可以是单色温闪光灯,也可 以是双色温闪光灯。双色温闪光灯是指暖光闪光灯和冷光闪光灯的组合,可以 用于不同色温下的光线补偿。
音频电路707可以包括麦克风和扬声器。麦克风用于采集用户及环境的声 波,并将声波转换为电信号输入至处理器701进行处理,或者输入至射频电路 704以实现语音通信。出于立体声采集或降噪的目的,麦克风可以为多个,分别 设置在终端700的不同部位。麦克风还可以是阵列麦克风或全向采集型麦克风。 扬声器则用于将来自处理器701或射频电路704的电信号转换为声波。扬声器 可以是传统的薄膜扬声器,也可以是压电陶瓷扬声器。当扬声器是压电陶瓷扬 声器时,不仅可以将电信号转换为人类可听见的声波,也可以将电信号转换为 人类听不见的声波以进行测距等用途。在一些实施例中,音频电路707还可以 包括耳机插孔。
定位组件708用于定位终端700的当前地理位置,以实现导航或LBS (LocationBased Service,基于位置的服务)。定位组件708可以是基于美国的 GPS(GlobalPositioning System,全球定位系统)、中国的北斗系统或俄罗斯的 伽利略系统的定位组件。
电源709用于为终端700中的各个组件进行供电。电源709可以是交流电、 直流电、一次性电池或可充电电池。当电源709包括可充电电池时,该可充电 电池可以是有线充电电池或无线充电电池。有线充电电池是通过有线线路充电 的电池,无线充电电池是通过无线线圈充电的电池。该可充电电池还可以用于 支持快充技术。
在一些实施例中,终端700还包括有一个或多个传感器710。该一个或多个 传感器710包括但不限于:加速度传感器711、陀螺仪传感器712、压力传感器 713、指纹传感器714、光学传感器715以及接近传感器716。
加速度传感器711可以检测以终端700建立的坐标系的三个坐标轴上的加 速度大小。比如,加速度传感器711可以用于检测重力加速度在三个坐标轴上 的分量。处理器701可以根据加速度传感器711采集的重力加速度信号,控制 触摸显示屏705以横向视图或纵向视图进行用户界面的显示。加速度传感器711 还可以用于游戏或者用户的运动数据的采集。
陀螺仪传感器712可以检测终端700的机体方向及转动角度,陀螺仪传感 器712可以与加速度传感器711协同采集用户对终端700的3D动作。处理器 701根据陀螺仪传感器712采集的数据,可以实现如下功能:动作感应(比如根 据用户的倾斜操作来改变UI)、拍摄时的图像稳定、游戏控制以及惯性导航。
压力传感器713可以设置在终端700的侧边框和/或触摸显示屏705的下层。 当压力传感器713设置在终端700的侧边框时,可以检测用户对终端700的握 持信号,由处理器701根据压力传感器713采集的握持信号进行左右手识别或 快捷操作。当压力传感器713设置在触摸显示屏705的下层时,由处理器701 根据用户对触摸显示屏705的压力操作,实现对UI界面上的可操作性控件进行 控制。可操作性控件包括按钮控件、滚动条控件、图标控件、菜单控件中的至 少一种。
指纹传感器714用于采集用户的指纹,由处理器701根据指纹传感器714 采集到的指纹识别用户的身份,或者,由指纹传感器714根据采集到的指纹识 别用户的身份。在识别出用户的身份为可信身份时,由处理器701授权该用户 执行相关的敏感操作,该敏感操作包括解锁屏幕、查看加密信息、下载软件、 支付及更改设置等。指纹传感器714可以被设置终端700的正面、背面或侧面。 当终端700上设置有物理按键或厂商Logo时,指纹传感器714可以与物理按键 或厂商Logo集成在一起。
光学传感器715用于采集环境光强度。在一个实施例中,处理器701可以 根据光学传感器715采集的环境光强度,控制触摸显示屏705的显示亮度。具 体地,当环境光强度较高时,调高触摸显示屏705的显示亮度;当环境光强度 较低时,调低触摸显示屏705的显示亮度。在另一个实施例中,处理器701还 可以根据光学传感器715采集的环境光强度,动态调整摄像头组件706的拍摄 参数。
接近传感器716,也称距离传感器,通常设置在终端700的前面板。接近传 感器716用于采集用户与终端700的正面之间的距离。在一个实施例中,当接 近传感器716检测到用户与终端700的正面之间的距离逐渐变小时,由处理器 701控制触摸显示屏705从亮屏状态切换为息屏状态;当接近传感器716检测到 用户与终端700的正面之间的距离逐渐变大时,由处理器701控制触摸显示屏 705从息屏状态切换为亮屏状态。
本领域技术人员可以理解,图7中示出的结构并不构成对终端700的限定, 可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件 布置。
可选地,该计算机可读存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、固态硬盘(SSD, Solid State Drives)或光盘等。其中,随机存取记忆体可以包括电阻式随机存取 记忆体(ReRAM,ResistanceRandom Access Memory)和动态随机存取存储器 (DRAM,Dynamic Random AccessMemory)。上述本申请实施例序号仅仅为了 描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过 硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于 一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或 光盘等。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的 精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的 保护范围之内。

Claims (10)

1.一种匿名函数的信息获取方法,其特征在于,所述方法包括:
获取字节码文件,所述字节码文件为含有所述匿名函数的源码文件在编译后生成的文件,所述字节码文件中包括引导函数和字节码常量池,所述引导函数中包括常量池索引;
从所述字节码常量池中获取与所述常量池索引对应的所述匿名函数的函数信息,得到所述常量池索引与所述函数信息之间的第一对应关系,所述函数信息中包括所述匿名函数的函数名;
获取动态字节码指令,所述动态字节码指令中包括所述属性表索引和接口信息描述符,所述属性表索引用于索引至对应的所述引导函数;
从所述字节码常量池中获取与所述接口信息描述符对应的所述接口信息,得到所述属性表索引和所述接口信息的第二对应关系;
结合所述第一对应关系和所述第二对应关系,得到所述匿名函数的信息。
2.根据权利要求1所述的方法,其特征在于,所述从所述字节码常量池中获取与所述常量池索引对应的所述匿名函数的函数信息,包括:
从所述字节码常量池中获取与所述常量池索引对应的方法句柄指针,所述方法句柄指针用于指向所述字节码常量池中的内容;
通过所述方法句柄指针的指示,从所述字节码常量池中获取所述匿名函数的所述函数信息。
3.根据权利要求2所述的方法,其特征在于,所述字节码文件中包括引导函数属性表;
所述从所述字节码常量池中获取由所述常量池索引得到的所述匿名函数的函数信息之前,还包括:
对所述引导函数属性表进行遍历,得到所述引导函数;
从所述引导函数中获取所述常量池索引。
4.根据权利要求1至3任一所述的方法,其特征在于,所述得到所述常量池索引与所述函数信息之间的第一对应关系,包括:
以所述常量池索引为关键字,以所述函数信息为值,得到所述常量池索引与所述函数信息之间的键值对作为所述第一对应关系。
5.根据权利要求1至3任一所述的方法,其特征在于,
所述函数信息中还包括所述匿名函数的函数签名,以及所述匿名函数所属类名中的至少一种。
6.根据权利要求1至3任一所述的方法,其特征在于,所述匿名函数为Lambda表达式表达的函数;
所述获取动态字节码指令,包括:
对所述字节码常量池进行遍历,得到所述字节码常量池中的所述动态字节码指令,其中,每个Lambda表达式对应一个所述动态字节码指令。
7.根据权利要求6所述的方法,其特征在于,
所述接口信息中包括接口类名和接口函数名中的至少一种。
8.一种匿名函数的信息获取装置,其特征在于,所述装置包括:
获取模块,用于获取字节码文件,所述字节码文件为含有所述匿名函数的源码文件在编译后生成的文件,所述字节码文件中包括引导函数和字节码常量池,所述引导函数中包括常量池索引;
所述获取模块,还用于从所述字节码常量池中获取与所述常量池索引对应的所述匿名函数的函数信息,得到所述常量池索引与所述函数信息之间的第一对应关系,所述函数信息中包括所述匿名函数的函数名;
所述获取模块,还用于获取动态字节码指令,所述动态字节码指令中包括所述常量池索引和接口信息描述符;
所述获取模块,还用于从所述字节码常量池中获取与所述接口信息描述符对应的所述接口信息,得到所述常量池索引和所述接口信息的第二对应关系;
确定模块,用于结合所述第一对应关系和所述第二对应关系,得到所述匿名函数的信息。
9.一种计算机设备,其特征在于,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如权利要求1至7任一所述的匿名函数的信息获取方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如权利要求1至7任一所述的匿名函数的信息获取方法。
CN201911320658.XA 2019-12-19 2019-12-19 匿名函数的信息获取方法、装置、设备及可读存储介质 Pending CN113010175A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911320658.XA CN113010175A (zh) 2019-12-19 2019-12-19 匿名函数的信息获取方法、装置、设备及可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911320658.XA CN113010175A (zh) 2019-12-19 2019-12-19 匿名函数的信息获取方法、装置、设备及可读存储介质

Publications (1)

Publication Number Publication Date
CN113010175A true CN113010175A (zh) 2021-06-22

Family

ID=76381456

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911320658.XA Pending CN113010175A (zh) 2019-12-19 2019-12-19 匿名函数的信息获取方法、装置、设备及可读存储介质

Country Status (1)

Country Link
CN (1) CN113010175A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023016481A1 (zh) * 2021-08-13 2023-02-16 华为技术有限公司 一种数据处理方法及相关装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023016481A1 (zh) * 2021-08-13 2023-02-16 华为技术有限公司 一种数据处理方法及相关装置

Similar Documents

Publication Publication Date Title
CN110841285B (zh) 界面元素的显示方法、装置、计算机设备及存储介质
CN111752666B (zh) 窗口显示方法、装置和终端
CN111191224B (zh) 虚拟机检测的对抗方法、装置及计算机可读存储介质
CN108132790B (zh) 检测无用代码的方法、装置及计算机存储介质
CN108717365B (zh) 在应用程序中执行功能的方法和装置
CN110851823B (zh) 数据访问方法、装置、终端及存储介质
CN113867848A (zh) 图形接口的调用方法、装置、设备及可读存储介质
CN110543350A (zh) 一种生成页面组件的方法及装置
CN111400002B (zh) 应用进程与处理器核绑定方法及终端
CN112749362A (zh) 控件创建方法、装置、设备及存储介质
CN115766490A (zh) 校准数据的获取方法、校准数据的存储方法、装置及设备
CN111125602B (zh) 页面构建方法、装置、设备和存储介质
CN110515962B (zh) 缓存数据的方法、装置、电子设备及存储介质
CN113553039A (zh) 算子的可执行代码的生成方法及装置
CN107943484B (zh) 执行业务功能的方法和装置
CN113469360A (zh) 推理方法及装置
CN108132817B (zh) 对象管理方法及装置
CN113010175A (zh) 匿名函数的信息获取方法、装置、设备及可读存储介质
CN112163677B (zh) 应用机器学习模型的方法、装置及设备
CN113268234A (zh) 页面生成方法、装置、终端和存储介质
CN112231619A (zh) 转换方法、装置、电子设备及存储介质
CN113312249A (zh) 日志数据生成方法、日志数据显示方法及装置
CN112131340B (zh) 字符串检测方法、装置及存储介质
CN110543305B (zh) 替换EasyUI组件的方法及装置
CN111930686B (zh) 存储日志的方法、装置和计算机设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40047262

Country of ref document: HK

SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination