CN107025105A - 代码生成方法及装置 - Google Patents

代码生成方法及装置 Download PDF

Info

Publication number
CN107025105A
CN107025105A CN201610848969.3A CN201610848969A CN107025105A CN 107025105 A CN107025105 A CN 107025105A CN 201610848969 A CN201610848969 A CN 201610848969A CN 107025105 A CN107025105 A CN 107025105A
Authority
CN
China
Prior art keywords
code
class
created
new class
attribute
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.)
Granted
Application number
CN201610848969.3A
Other languages
English (en)
Other versions
CN107025105B (zh
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.)
Advanced Nova Technology Singapore Holdings Ltd
Original Assignee
Alibaba Group Holding 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 Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201610848969.3A priority Critical patent/CN107025105B/zh
Publication of CN107025105A publication Critical patent/CN107025105A/zh
Application granted granted Critical
Publication of CN107025105B publication Critical patent/CN107025105B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • 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/436Semantic checking
    • G06F8/437Type checking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Computational Linguistics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供了一种代码生成方法及装置,其中,方法包括:运行在虚拟机中的第一实例在创建新类的过程中,通过执行第一实例中包含的第一代码,从类库中获取目标类的属性或方法的第二代码并将获取到的第二代码作为该新类的属性或方法的代码写入到所述新类中。本发明在新类的创建过程中,通过执行预设的第一代码来动态获取目标类的属性或方法的第二代码,并写入到新类中,通过这样的机制,可以将主程序中包含的板式代码的部分用上述第一代码代替,然后在源代码经过编译器的编译后,在实例运行的过程中,动态地获取与板式代码的内容对应的第二代码,并固化到新类中作为该新类代码的一部分,从而能够极大节省系统的开销,提高代码的执行效率。

Description

代码生成方法及装置
技术领域
本发明实施例一种代码生成方法及装置,属于计算机技术领域。
背景技术
目前的软件程序越来越复杂,代码的规模也越来越庞大,这其中,存在大量重复或者相类似的代码,大量重复的代码会给代码维护人员的维护工作造成很大的困难,例如,类中任意一个属性值的变化,都会导致多处代码的变更,维护人员维护起来十分困难,并且非常容易出错,导致无法编译通过或者即使编译通过也出现运行错误等。以较为常用的Java为例,在Java程序中,经常会存在代码结构近似但Java语法无法消除的重复代码,这种代码称之为板式代码。
现有技术中提出了针对板式代码引入反射机制,Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。通过引入反射机制,在程序运行过程中,在需要执行该部分代码时,动态调用板式代码所对应的类的属性和方法,从而减少针对板式代码的维护。
但是,反射机制的缺陷也很明显,由于编译器不能对反射机制所涉及的代码进行优化,所有的操作都需要按照反射机制的程序来执行,即采用类似查表的操作,要遍历目标类的全部类结构,然后才能完成对类的属性和方法的调用。而在实际的程序运行的过程中,针对同一部分板式代码可能要执行许多次,而每次都需要通过反射机制来进行调用,其运行效率极低,会导致较大的系统开销,尤其在涉及大量的属性信息进行操作的场景,其系统开销将会更大。
发明内容
本发明实施例的目的在于提供一种代码生成方法及装置,以提高代码执行效率,节省系统开销。
为了实现上述目的,本发明实施例提供了一种代码生成方法,包括:
运行在虚拟机中的第一实例在创建新类的过程中,通过执行第一实例中包含的第一代码,执行如下处理:
从类库中获取目标类的属性或方法的第二代码;
将获取到的第二代码作为该新类的属性或方法的代码写入到所述新类中,
其中,所述第一代码中包括目标类的属性或者方法的名称,在源代码中,板式代码对应的部分被所述第一代码替代,所述第二代码的内容对应于所述板式代码,所述第一实例为根据所述源代码生成的实例,所述第二代码为字节码。
本发明实施例还提供了一种代码生成装置,包括代码获取模块和代码写入模块,所述代码获取模块和代码吸入模块处于运行在虚拟机中的第一实例中:
所述代码获取模块,用于在第一实例创建新类的过程中,通过执行第一实例中包含的第一代码,从类库中获取目标类的属性或方法的第二代码;
所述代码写入模块,用于在第一实例创建新类的过程中,通过执行第一实例中包含的第一代码,将获取到的第二代码作为该新类的属性或方法的代码写入到所述新类中;
其中,所述第一代码中包括目标类的属性或者方法的名称,在源代码中,板式代码对应的部分被所述第一代码替代,所述第二代码的内容对应于所述板式代码,所述第一实例为根据所述源代码生成的实例,所述第二代码为字节码。
本发明实施例的代码生成方法及装置,在新类的创建过程中,通过执行预设的第一代码来动态获取目标类的属性或方法的第二代码,并写入到新类中,作为新类的代码的一部分而被固化,通过这样的机制,可以将现有技术中主程序中包含的板式代码的部分用上述第一代码代替,然后在源代码经过编译器的编译后,在实例运行的过程中,动态地获取与板式代码的内容对应的第二代码,并固化到新类中作为该新类代码的一部分,从而使得该新类可以一直使用上述第二代码,而不是像现有技术中采用反射机制那样,每次调用该新类的方法或属性时,都需要通过反射机制来重新从类库中进行调用,从而能够极大节省系统的开销,提高代码的执行效率。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
图1为本发明实施例一的代码生成方法的流程示意图。
图2为本发明实施例一的代码生成方法的技术原理示意图。
图3为本发明实施例二的代码生成方法的流程示意图。
图4为本发明实施例三的代码生成方法的流程示意图。
图5为本发明实施例四的代码生成装置的结构示意图。
图6为本发明实施例五的代码生成装置的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。首先,先对本发明实施例中涉及的部分术语或概念进行一下解释和说明:
Java字节码(Java bytecode):是Java虚拟机(JVM)执行的一种指令格式,Java虚拟机规格说明(通常也被称为VMSpec)所定义的,字节码是经过编译器编译后的格式,可以在虚拟机中直接运行。
ASM:ASM是一个Java字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM可以直接产生二进制class文件,也可以在类被加载入Java虚拟机之前动态改变类行为。
CGLIB(Code Generation Library):CGLIB是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。
板式代码:结构近似但程序编译系统(基于Java语法机制无法通过程序编译系统消除)无法消除的重复代码。在本发明实施例中,板式代码主要涉及类的方法或属性的部分。
Java反射机制是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
源代码:程序的主体代码,在编写完成后经过编译器编译后加载到虚拟机中进行运行。在本发明实施例中,源代码中不包括板式代码,板式代码部分被模板代码(后续所提到的第一代码)替代,在源代码运行的过程中,在创建新类时,通过执行模板代码来动态添加该新类的属性或方法(这部分是对应于现有技术的板式代码),然后动态完成该新类的属性和方法的创建。
模板代码(第一代码):该部分代码主要逻辑是为新类写入属性或方法(这部分是对应于现有技术的板式代码),具体方式是通过去类库中查找到目标类的属性或方法(即新类需要调用的属性或方法),并将类库中的目标类的属性或方法的字节码写入到新类中。模板代码主要是针对板式代码而编写的,对于板式代码较多的情形,可以将编写的模板代码制作成代码库(采用CGLIB技术来实现),从而可以便于JVM对于模板代码的调用。
新类:在本发明实施例中,源代码在运行的过程中,创建的类。
目标类:位于类库中的已经经过编译的类。
以下将通过几个具体实施例来进一步说明本发明的技术方案,其中,在各个实施例中将主要以Java编程技术为技术背景进行说明,不过,本领域技术人员应当理解,本发明的技术方案仍然适用于其他在技术类似的编程技术。
实施例一
如图1和2所示,其中,图1为发明实施例一的代码生成方法的流程示意图,图2为本发明实施例一的代码生成方法的技术原理示意图。本实施例中,在运行在虚拟机中的第一实例在创建新类的过程中,通过执行预设的第一代码来完成新类的属性或方法部分的代码的写入。这里的第一代码是包含在源代码中的代码。该第一代码中需要包括目标类的属性或者方法的名称,这样才能够从类库中找到目标类的属性或方法,也就是说,目标类的属性或方法的名称是预先写在源代码中的。
具体地,通过执行第一实例中包含的第一代码,执行如下操作:
步骤101:从类库中获取目标类的属性或方法的第二代码。其中,类库中的代码为经过编译后的代码,即第二代码为字节码,Java虚拟机可以直接识别并且执行,类库的文件可以为以“class”为后缀的文件。如图2所示,执行获取目标类的属性或方法的第二代码的主体为运行在虚拟机中的第一实例,其通过访问存储有目标类的代码的类库而获取上述第二代码。
步骤102:将获取到的第二代码作为该新类的属性或方法的代码写入到新类中。在该步骤中,将新类的属性或方法的代码写入到新类中之后,就可以完成了新类的创建。在后续需要调用该新类的代码逻辑时,可以基于该新类的代码生成对应的实例并执行相应的功能。如图2所示,该步骤的执行主体也是上述的第一实例,其最终完成新类的创建过程,将从类库中获取到的字节码写入的新类的属性或方法对应的位置,从而生成新类。
本实施例的主要目的就是要更好的消除板式代码造成的影响。板式代码具体指结构近似但程序编译系统无法消除的重复代码。例如在Java语言中的toString方法,该方法是Java语言中常用的方法,该方法出现在各个不同的类中时,会根据类的需求而有所改变,但是,其中也会存在很多相同或者类似的代码,这些代码就是板式代码。
上述的第一代码的作用主要是在源代码中替代现有技术中的板式代码,然后在源代码经过编译器编译后,在虚拟机中运行过程(根据源代码生成实例并运行)中,动态地生成现有技术中对应于板式代码部分的代码内容。即上述的第二代码的内容对应于板式代码,而上述的第一代码的内容就是为了动态生成第二代码,上述的第一实例为根据源代码生成的实例。上述的类库可以是Java虚拟机中自带的类库,也可以是通过人工预先编写并经过编译后而生成的类库。
上述的新类中涉及的属性或方法就包含板式代码的内容,如果按照传统的方式来进行代码编写,该新类的属性或方法中的代码在编译之前就会写在源代码中,这样会造成源代码的内容庞大,并且由于该部分涉及板式代码,导致维护起来也非常困难。
如果按照现有技术中所提及的使用反射机制来处理,则替代上述板式代码部分的代码为与执行反射方法相关的代码(例如class.forname等),该部分代码的功能为查找到目标类的属性或方法,并进行调用,而不是将目标类的属性或方法的代码写入到新类中。基于这样的机制,每次程序运行到需要创建该新类进而将该新类实例化以实现相应代码逻辑时,都需要进行一次反射过程,由于反射机制是Java系统规定好的机制,反射机制本身较为繁琐,所有反射操作都需要类似查表的操作,需要遍历目标类的整体结构,并且调用过程中的参数需要装箱拆箱、解封装等处理,这使得虚拟机在每次执行该新类相关的属性或方法时,都要执行繁琐的反射流程,从而严重耗费系统资源。
相比之下,本发明实施例中,上述第一代码的代码逻辑为查找到目标类的属性或方法,并将其写入到新类中,在后续涉及到该新类的方法或属性的调用时,不需要再进行查找目标类的属性或方法的操作,也就是说,该目标类的属性或方法已经被固化到了该新类中,已经永久地作为该新类的一部分了。由此可见,上述方法,不仅精简了源代码中的板式代码,相比现有技术中的采用反射机制来替代板式代码的技术方案,在后续的代码执行过程中,避免了重复执行反射操作所带来的麻烦,减少了系统资源的耗费。本发明实施例尤其适用于板式代码高发的场景,如toString、equals、compareTo等方法,都可以通过引入本发明实施例的方法而得到改善。
实施例二
如图3所示,其为本发明实施例二的代码生成方法的流程示意图,本实施例将对实施例一种的步骤101和步骤102的具体执行过程进行详细说明。
在上述步骤101中,从类库中获取目标类的属性或方法的第二代码可以具体为:通过反射机制从类库中获取目标类的属性或方法的第二代码。
如前面所说的,通过Java反射机制可以在程序运行状态下,获取类库中任意一个类的所有属性和方法,在步骤101中,可以在生成新类的过程中,利用Java反射机制的特性,通过遍历目标类的结构,来获取想要的目标类的属性或方法相关信息(例如在类库中的具体位置),在获取到相关信息后,不是直接调用获取到的目标类的属性或方法,而是将该目标类的属性或方法直接写入到新类中,来完成新类的创建,在新类创建后便不需要再通过反射机制去获取目标类的属性或方法相关信息了,而是直接调用已经生成的新类即可。
具体地,该步骤101可以具体包括:
步骤1021:通过反射机制从类库中获取目标类的属性或方法的名称。通过反射机制可以获取到目标类的全部类结构,即可以获取到该目标类的全部属性或方法的名称列表。
步骤1022:将属性或方法的名称作为入参入栈。该步骤可以使用JVM指令集中的aload指令来完成,通过aload指令将获取到的属性名称或方法名称进行入栈操作。在步骤1022之后,还可以包括类型转换的检查,JVM指令集中的checkcast指令来完成,具体程序代码可以为“checkcast Targetclass”,其中,Targetclass是指进行类型转换检查的目标类,在本发明实施例中Targetclass即为上述的新建的新类的名称。例如,如果要动态生成的方法为toString,则上述的新类对应为string类,即Targetclass为string类。
步骤1023:根据入参,调用目标类的属性或方法,并在调用的过程中,获取目标类的属性或方法对应的第二代码。该步骤中可以使用JVM指令集中的“invokevirtual”来完成,“invokevirtual”是JVM指令集中用来调用实例的指令,在该步骤中,通过属性的名称或方法名称作为invokevirtual的入参,来调用类库中的目标类的属性或方法,通过调用过程来获取到目标类的属性或方法对应的字节码。
相应地,实施例一中的步骤102可以具体为:
步骤1024:调用字符串拼接方法将第二代码写入到新类中。该步骤可以通过Java语言中的append方法实现,具体调用执行可以采用JVM指令集中的invokevirtualStringBuffer#append来实现。
此外需要说明的是,在实际应用中,往往需要获取目标类的多个属性或者方法的代码,相应地,本实施例中的各个操作步骤,可以循环执行。如前面所说的,在步骤1021中,可以获取到目标类的全部属性或方法的名称列表,本实施例可以根据该列表,每次取出一个属性名称或方法名称来执行本实施例中的各个步骤,从而生成相应的属性或者方法对应的字节码。
在本实施例,通过借助JVM指令集中的相关方法来为新类获取属性或方法对应的代码,从而生成可以在Java虚拟机中执行的字节码(即生成板式代码部分的字节码),由此,替代了现有技术中通过反射机制来动态生成板式代码的方式,动态生成代码的效率提高了,从而也提高了JVM运行程序代码的效率。
实施例三
如图4所示,其为本发明实施例三的代码生成方法的流程示意图。在本实施例中引入了为新类创建索引信息并存储到缓存的机制,将该新类的相关信息(例如,新类的名称、包含的方法或属性等)编辑为索引信息,并写入缓存中。这样,在后续的其他的程序执行的过程中,如果需要创建新类的情形出现,则可以先通过缓存中的索引信息进行查找,如果查找到系统或者类似的已经创建过的类,则可以通过直接加载该已经创建过的类,从而就不用再执行上述实施例一中的创建新类的过程了,从而防止类的重复创建,节省了内存空间,加快了内存访问速度。具体可以通过JVM的Classloader(类加载器)来执行类的加载工作。
具体地,在新类创建后,即在实施例一的步骤102之后,还可以包括:
步骤103:为该新类创建索引信息并存储到缓存中。通过将创建的新类放入缓存中,如果其他实例在需要创建新类时,可以先检索缓存中是否存在已经创建好的类,如果存在,则可以直接使用已经创建好的类。
相应地,在步骤101之前,即在开始创建新类之前还可以包括:
步骤100a:获取待创建的新类的信息;
步骤100b:将该待创建的新类的信息与缓存中存储的已经创建的类的索引信息进行匹配,以查找是否存在与该待创建的新类匹配的已创建的类。如果查找到与该待创建的新类匹配的已创建的类,则执行步骤100c,如果没有查找到与该待创建的新类匹配的已创建的类,则开始执行创建新类的处理,之后便可以执行步骤101的处理。
步骤100c:将该已创建的类作为待创建的新类加载到内存中。
通过在创建新类前,先在缓存中进行查找,从而能够避免新类的重复创建,以提高程序的运行效率。尤其对于板式代码多的情形,类的重复情况会很多,因此,将创建好的新类放入缓存中,能够极大提高程序运行效率,也能够节省内存空间,避免内存中存在许多被重复创建的类。
实施例四
如图5所示,其为本发明实施例四的代码生成装置的结构示意图,如图5所示,本实施例的代码生成装置包括代码获取模块11和代码写入模块12,代码获取模块和代码吸入模块处于运行在虚拟机中的第一实例1中:
代码获取模块11,用于在第一实例1创建新类的过程中,通过执行第一实例中包含的第一代码,从类库中获取目标类的属性或方法的第二代码。具体地,可以通过反射机制从类库中获取目标类的属性或方法的第二代码。关于通过反射机制来获取目标类的属性或方法的第二代码的具体实现方式已经在实施例二中进行了详细描述。
代码写入模块12,用于在第一实例1创建新类的过程中,通过执行第一实例中包含的第一代码,将获取到的第二代码作为该新类的属性或方法的代码写入到新类中。该部分的操作可以通过调用字符串拼接方法将第二代码写入到新类中,例如可以通过Java语言中的append方法实现。
其中,第一代码中包括目标类的属性或者方法的名称,在源代码中,板式代码对应的部分被第一代码替代,第二代码的内容对应于板式代码,第一实例为根据源代码生成的实例,第二代码为字节码。
本实施例的代码生成装置,在新类的创建过程中,通过执行预设的第一代码来动态获取目标类的属性或方法的第二代码,并写入到新类中,作为新类的代码的一部分而被固化,通过这样的机制,可以将现有技术中主程序中包含的板式代码的部分用上述第一代码代替,然后在源代码经过编译器的编译后,在实例运行的过程中,动态地获取与板式代码的内容对应的第二代码,并固化到新类中作为该新类代码的一部分,从而使得该新类可以一直使用上述第二代码,而不是像现有技术中采用反射机制那样,每次调用该新类的方法或属性时,都需要通过反射机制来重新从类库中进行调用,从而能够极大节省系统的开销,提高代码的执行效率。
实施例五
如图6所示,其为本发明实施例五的代码生成装置的结构示意图,如图5所示,在实施例四的基础上,本实施例的代码生成装置还可以包括索引创建及缓存模块13,用于为新类创建索引信息并存储到缓存中。通过将创建的新类放入缓存中,如果其他实例在需要创建新类时,可以先检索缓存中是否存在已经创建好的类,如果存在,则可以直接使用已经创建好的类。
进一步地,本实施例的代码生成装置还可以包括类查询模块10,用于在开始创建新类之前执行如下处理:
获取待创建的新类的信息;
将该待创建的新类的信息与缓存中存储的已经创建的类的索引信息进行匹配,以查找是否存在与该待创建的新类匹配的已创建的类;
如果查找到与该待创建的新类匹配的已创建的类,则将该已创建的类作为待创建的新类加载到内存中,如果没有查找到与该待创建的新类匹配的已创建的类,则执行创建新类的处理。
上述处理即为实施例三中的步骤100a至100c,本实施例通过在创建新类前,先在缓存中进行查找,从而能够避免新类的重复创建,以提高程序的运行效率。尤其对于板式代码多的情形,类的重复情况会很多,因此,将创建好的新类放入缓存中,能够极大提高程序运行效率,也能够节省内存空间,避免内存中存在许多被重复创建的类。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

Claims (10)

1.一种代码生成方法,其特征在于,包括:
运行在虚拟机中的第一实例在创建新类的过程中,通过执行第一实例中包含的第一代码,执行如下处理:
从类库中获取目标类的属性或方法的第二代码;
将获取到的第二代码作为该新类的属性或方法的代码写入到所述新类中,
其中,所述第一代码中包括目标类的属性或者方法的名称,在源代码中,板式代码对应的部分被所述第一代码替代,所述第二代码的内容对应于所述板式代码,所述第一实例为根据所述源代码生成的实例,所述第二代码为字节码。
2.根据权利要求1所述的方法,其特征在于,所述从类库中获取目标类的属性或方法的第二代码包括:
通过反射机制从所述类库中获取所述目标类的属性或方法的第二代码。
3.根据权利要求1所述的方法,其特征在于,还包括:
为所述新类创建索引信息并存储到缓存中。
4.根据权利要求3所述的方法,其特征在于,在开始创建新类之前还包括:
获取待创建的新类的信息;
将该待创建的新类的信息与缓存中存储的已经创建的类的索引信息进行匹配,以查找是否存在与该待创建的新类匹配的已创建的类;
如果查找到与该待创建的新类匹配的已创建的类,则将该已创建的类作为所述待创建的新类加载到内存中,如果没有查找到与该待创建的新类匹配的已创建的类,则执行所述创建新类的处理。
5.根据权利要求2所述的方法,其特征在于,通过反射机制从所述类库中获取所述目标类的属性或方法的第二代码包括:
通过反射机制从所述类库中获取所述目标类的属性或方法的名称;
将所述属性或方法的名称作为入参入栈;
根据所述入参,调用所述目标类的属性或方法,并并在调用的过程中,获取所述目标类的属性或方法对应的所述第二代码。
6.根据权利要求5所述的方法,其特征在于,将获取到的第二代码作为该新类的属性或方法的代码写入到所述新类中包括:
调用字符串拼接方法将所述第二代码写入到所述新类中。
7.一种代码生成装置,其特征在于,包括代码获取模块和代码写入模块,所述代码获取模块和代码吸入模块处于运行在虚拟机中的第一实例中:
所述代码获取模块,用于在第一实例创建新类的过程中,通过执行第一实例中包含的第一代码,从类库中获取目标类的属性或方法的第二代码;
所述代码写入模块,用于在第一实例创建新类的过程中,通过执行第一实例中包含的第一代码,将获取到的第二代码作为该新类的属性或方法的代码写入到所述新类中;
其中,所述第一代码中包括目标类的属性或者方法的名称,在源代码中,板式代码对应的部分被所述第一代码替代,所述第二代码的内容对应于所述板式代码,所述第一实例为根据所述源代码生成的实例,所述第二代码为字节码。
8.根据权利要求7所述的装置,其特征在于,所述从类库中获取目标类的属性或方法的第二代码包括:
通过反射机制从所述类库中获取所述目标类的属性或方法的第二代码。
9.根据权利要求7所述的装置,其特征在于,还包括:
索引创建及缓存模块,用于为所述新类创建索引信息并存储到缓存中。
10.根据权利要求9所述的装置,其特征在于,还包括类查询模块,用于在开始创建新类之前执行如下处理:
获取待创建的新类的信息;
将该待创建的新类的信息与缓存中存储的已经创建的类的索引信息进行匹配,以查找是否存在与该待创建的新类匹配的已创建的类;
如果查找到与该待创建的新类匹配的已创建的类,则将该已创建的类作为所述待创建的新类加载到内存中,如果没有查找到与该待创建的新类匹配的已创建的类,则执行所述创建新类的处理。
CN201610848969.3A 2016-09-23 2016-09-23 代码生成方法及装置 Active CN107025105B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610848969.3A CN107025105B (zh) 2016-09-23 2016-09-23 代码生成方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610848969.3A CN107025105B (zh) 2016-09-23 2016-09-23 代码生成方法及装置

Publications (2)

Publication Number Publication Date
CN107025105A true CN107025105A (zh) 2017-08-08
CN107025105B CN107025105B (zh) 2020-10-16

Family

ID=59524420

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610848969.3A Active CN107025105B (zh) 2016-09-23 2016-09-23 代码生成方法及装置

Country Status (1)

Country Link
CN (1) CN107025105B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111736916A (zh) * 2020-06-08 2020-10-02 北京达佳互联信息技术有限公司 基于Java语言的动态扩展方法、装置、电子设备及存储介质
CN113434147A (zh) * 2021-06-25 2021-09-24 北京达佳互联信息技术有限公司 基于ProtoBuf协议的消息解析方法及装置
WO2024045382A1 (zh) * 2022-08-31 2024-03-07 蚂蚁区块链科技(上海)有限公司 区块链中实现反射机制

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101174217A (zh) * 2007-11-22 2008-05-07 上海交通大学 Java程序可动态更新化实现方法
CN102725730A (zh) * 2009-12-18 2012-10-10 赛丹思科大学 用于静态键入的基于类的面向对象的软件的非阻挡动态更新的方法、计算机程序产品和系统
CN104239072A (zh) * 2014-10-15 2014-12-24 北京国双科技有限公司 软件的程序代码的生成方法及装置
CN104391717A (zh) * 2014-11-18 2015-03-04 南京大学 一种调试时代码动态更新方法
CN105677324A (zh) * 2015-12-31 2016-06-15 合肥大多数信息科技有限公司 一种自动生成实体类代码的方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101174217A (zh) * 2007-11-22 2008-05-07 上海交通大学 Java程序可动态更新化实现方法
CN102725730A (zh) * 2009-12-18 2012-10-10 赛丹思科大学 用于静态键入的基于类的面向对象的软件的非阻挡动态更新的方法、计算机程序产品和系统
CN104239072A (zh) * 2014-10-15 2014-12-24 北京国双科技有限公司 软件的程序代码的生成方法及装置
CN104391717A (zh) * 2014-11-18 2015-03-04 南京大学 一种调试时代码动态更新方法
CN105677324A (zh) * 2015-12-31 2016-06-15 合肥大多数信息科技有限公司 一种自动生成实体类代码的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
XIAOFLY_LOVE: "Java反射机制创建对象", 《HTTP://WWW.CNBLOGS.COM/SOFEELLOVE/P/10708560.HTML》 *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111736916A (zh) * 2020-06-08 2020-10-02 北京达佳互联信息技术有限公司 基于Java语言的动态扩展方法、装置、电子设备及存储介质
CN113434147A (zh) * 2021-06-25 2021-09-24 北京达佳互联信息技术有限公司 基于ProtoBuf协议的消息解析方法及装置
CN113434147B (zh) * 2021-06-25 2024-05-14 北京达佳互联信息技术有限公司 基于ProtoBuf协议的消息解析方法及装置
WO2024045382A1 (zh) * 2022-08-31 2024-03-07 蚂蚁区块链科技(上海)有限公司 区块链中实现反射机制

Also Published As

Publication number Publication date
CN107025105B (zh) 2020-10-16

Similar Documents

Publication Publication Date Title
US9891900B2 (en) Generation of specialized methods based on generic methods and type parameterizations
US8201171B2 (en) Adjacent data parallel and streaming operator fusion
CN103853532B (zh) 用于函数调用的方法和装置
US8601456B2 (en) Software transactional protection of managed pointers
US10083014B2 (en) Generating dynamic modular proxies
EP3350696A1 (en) Overriding a migrated method of an updated type
US20080222198A1 (en) Data processing apparatus, method and computer program product for reducing memory usage of an object oriented program
EP2058735A1 (en) System and method of executing a dynamic program in a structured environment
US10346310B2 (en) Cache block apparatus and methods
CN107025105A (zh) 代码生成方法及装置
US8276111B2 (en) Providing access to a dataset in a type-safe manner
US7966600B2 (en) Distributed resource understanding tool management
US9639375B2 (en) Generation of language bindings for libraries using data from compiler generated debug information
US6901591B1 (en) Frameworks for invoking methods in virtual machines
CN112487092B (zh) 一种基于区块链的智能合约调用方法及装置
US20150020051A1 (en) Method and apparatus for automated conversion of software applications
US20080148223A1 (en) System for defining a declarative language
CN100549958C (zh) 一种类文件装载方法和系统
US7194736B2 (en) Dynamic division optimization for a just-in-time compiler
Blagoev Using R programming language for processing of large data sets
US7774767B2 (en) System and method for compiler interprocedural optimization having support for object files in libraries
CN113064591A (zh) 一种wpf页面动态生成方法、系统、设备及介质
JP2012022580A (ja) 情報処理装置、情報処理方法
US20120330878A1 (en) Conventions for inferring data models
US11875168B2 (en) Optimizing execution of foreign method handles on a virtual machine

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20201105

Address after: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman, British Islands

Patentee after: Innovative advanced technology Co.,Ltd.

Address before: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman, British Islands

Patentee before: Advanced innovation technology Co.,Ltd.

Effective date of registration: 20201105

Address after: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman, British Islands

Patentee after: Advanced innovation technology Co.,Ltd.

Address before: A four-storey 847 mailbox in Grand Cayman Capital Building, British Cayman Islands

Patentee before: Alibaba Group Holding Ltd.

TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20240222

Address after: Guohao Times City # 20-01, 128 Meizhi Road, Singapore

Patentee after: Advanced Nova Technology (Singapore) Holdings Ltd.

Country or region after: Singapore

Address before: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman, British Islands

Patentee before: Innovative advanced technology Co.,Ltd.

Country or region before: Cayman Islands

TR01 Transfer of patent right