CN111651221B - 注解国际化方法及装置、存储介质及电子设备 - Google Patents
注解国际化方法及装置、存储介质及电子设备 Download PDFInfo
- Publication number
- CN111651221B CN111651221B CN202010674173.7A CN202010674173A CN111651221B CN 111651221 B CN111651221 B CN 111651221B CN 202010674173 A CN202010674173 A CN 202010674173A CN 111651221 B CN111651221 B CN 111651221B
- Authority
- CN
- China
- Prior art keywords
- annotation
- attribute
- internationalization
- name
- internationalized
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 56
- 230000007246 mechanism Effects 0.000 claims abstract description 37
- 238000004590 computer program Methods 0.000 claims description 8
- 230000008569 process Effects 0.000 abstract description 10
- 230000006870 function Effects 0.000 description 7
- 238000004891 communication Methods 0.000 description 5
- 230000014759 maintenance of location Effects 0.000 description 5
- 238000011161 development Methods 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Library & Information Science (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请涉及软件开发技术领域,提供一种注解国际化方法及装置、存储介质及电子设备。其中,注解国际化方法包括:通过Java的反射机制读取业务类包含的注解对象;确定注解对象包含的属性项中需要国际化的目标属性项,并获取针对目标属性项的国际化资源文本;通过Java的反射机制将目标属性项的属性值设置为国际化资源文本。该方法在程序的运行过程中,利用Java的反射机制读取注解对象,并利用Java的反射机制将注解对象中的目标属性项的属性值设置为国际化资源文本,从而实现了对目标属性项的属性值的国际化。该方法提供了一种针对Java注解进行国际化的解决方案,该方案简单高效,便于开发人员使用。
Description
技术领域
本发明涉及软件开发技术领域,具体而言,涉及一种注解国际化方法及装置、存储介质及电子设备。
背景技术
在应用软件产品中,国际化已经是很流行的解决方案,只要一款应用软件涉及使用不同语言的用户,通常都需要进行国际化。例如,某款应用软件的菜单默认显示中文,但根据使用英文的用户所作的配置,可以将菜单以英文显示。在Java应用的开发过程中,有时需要对Java注解进行国际化,但现有技术中还没有对应的解决方案,虽然可以通过将国际化相关的逻辑从注解移至普通的Java代码中来回避这一问题,但终究会导致开发不便。
发明内容
本申请实施例的目的在于提供一种注解国际化方法及装置、存储介质及电子设备,以改善上述技术问题。
为实现上述目的,本申请提供如下技术方案:
第一方面,本申请实施例提供一种注解国际化方法,包括:通过Java的反射机制读取业务类包含的注解对象;确定所述注解对象包含的属性项中需要国际化的目标属性项,并获取针对所述目标属性项的国际化资源文本;通过Java的反射机制将所述目标属性项的属性值设置为所述国际化资源文本。
上述方法在应用程序的运行过程中,利用Java的反射机制读取注解对象,并利用Java的反射机制将注解对象中的目标属性项的属性值设置为国际化资源文本,从而实现了对目标属性项的属性值的国际化。该方法提供了一种针对Java注解进行国际化的解决方案,该方案简单高效,便于开发人员使用。
在第一方面的一种实现方式中,所述确定所述注解对象包含的属性项中需要国际化的目标属性项,包括:通过Java的反射机制读取所述注解对象包含的属性项,并将属性值中包含有特定的标识字串的属性项确定为所述目标属性项。
在配置注解时,对于注解中需要进行国际化的属性项,其属性值中应当包含特定的标识字串,从而在对注解对象进行解析时根据该标识字串就可以确定某个属性项是否需要国际化。
在第一方面的一种实现方式中,所述获取针对所述目标属性项的国际化资源文本,包括:获取所述业务类;根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件;从所述国际化资源文件中读取与所述目标属性项的属性值中包含的关键字对应的所述国际化资源文本。
国际化资源文件配置好后,可以按照指定的规则进行命名,并保存在指定的包下(即某个文件夹),国际化资源文件的完整保存路径(包括包名和文件名)由业务类的包名称、业务类的名称以及当前的语言环境三项信息确定。当然,国际化资源文件也可以预先加载到内存以提高访问速度,不过仍可由上述三项信息确定要访问的国际化资源文件。
在第一方面的一种实现方式中,所述获取所述业务类,包括:判断所述注解对象中是否包含业务类属性项;若包含所述业务类属性项,则读取所述业务类属性项的属性值,该属性值被设置为所述业务类;若不包含所述业务类属性项,则通过Java的反射机制获取所述业务类。
注解中可以设置一项称为业务类属性的属性项,该属性项的属性值被配置为使用该注解的业务类,从而根据业务类属性项就可以快速地获得业务类的名称,业务类的包名称等信息。当然,有一些注解(例如,第三方注解)中不便于配置该属性项,也可以在应用程序的运行过程中直接通过Java的反射机制获得业务类。
在第一方面的一种实现方式中,所述根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件,包括:根据所述业务类的包名称以及当前的语言环境确定所述国际化资源文件的存放路径,根据所述业务类的名称确定所述国际化资源文件的文件名称;或者,根据所述业务类的包名称确定所述国际化资源文件的存放路径,根据所述业务类的名称以及当前的语言环境确定所述国际化资源文件的文件名称。
表征当前的语言环境的字串既可以出现在包名称中,也可以出现在文件名称中,都可以起到区分不同语言的国际化资源文件的作用,形成以上两种方案。
第二方面,本申请实施例提供一种注解国际化装置,包括:注解对象获取模块,用于通过Java的反射机制读取业务类包含的注解对象;资源获取模块,用于确定所述注解对象包含的属性项中需要国际化的目标属性项,并获取针对所述目标属性项的国际化资源文本;国际化模块,用于通过Java的反射机制将所述目标属性项的属性值替换为所述国际化资源文本。
在第二方面的一种实现方式中,资源获取模块确定所述注解对象包含的属性项中需要国际化的目标属性项,包括:通过Java的反射机制读取所述注解对象包含的属性项,并根据每个属性项的属性值判断该属性项是否需要国际化;其中,需要国际化的属性项的属性值中包含有特定的标识字串。
在第二方面的一种实现方式中,资源获取模块获取针对所述目标属性项的国际化资源文本,包括:获取所述业务类;根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件;从所述国际化资源文件中读取与所述目标属性项的属性值中包含的关键字对应的所述国际化资源文本。
在第二方面的一种实现方式中,资源获取模块获取所述业务类,包括:判断所述注解对象中是否包含业务类属性项;若包含所述业务类属性项,则读取所述业务类属性项的属性值,该属性值被设置为所述业务类;若不包含所述业务类属性项,则通过Java的反射机制获取所述业务类。
在第二方面的一种实现方式中,资源获取模块根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件,包括:根据所述业务类的包名称以及当前的语言环境确定所述国际化资源文件的存放路径,根据所述业务类的名称确定所述国际化资源文件的文件名称;或者,根据所述业务类的包名称确定所述国际化资源文件的存放路径,根据所述业务类的名称以及当前的语言环境确定所述国际化资源文件的文件名称。
第三方面,本申请实施例提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序指令,所述计算机程序指令被处理器读取并运行时,执行第一方面或第一方面的任意一种可能的实现方式提供的注解国际化方法。
第四方面,本申请实施例提供一种电子设备,包括:存储器以及处理器,所述存储器中存储有计算机程序指令,所述计算机程序指令被所述处理器读取并运行时,执行第一方面或第一方面的任意一种可能的实现方式提供的注解国际化方法。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出了一个具有国际化需求的软件界面的示意图;
图2示出了本申请实施例提供的一种注解国际化方法的流程图;
图3示出了本申请实施例提供的一种注解国际化装置的模块图;
图4示出了本申请实施例提供的一种电子设备的示意图。
具体实施方式
目前,对应用软件进行国际化已经成为一种普遍的需求,针对Java应用,常用的国际化方式如下:
国际化前
return"这里是中文";
国际化后
returnI18n.getValue(User.class,"this.is.chinese","这里是中文");
其中,返回(return)的字符串可以是应用软件要显示在界面上的文本,I18n是一个用于处理国际化的Java类,该类的getValue方法用于获取国际化资源文件中的国际化资源文本,该方法包括三个参数,业务类(User.class)、国际化资源文件中的关键字("this.is.chinese")以及国际化资源文本的默认值("这里是中文"),其中,关键字与国际化资源文件中的某个国际化资源文本关联(可以认为是键值对结构)。假设有中英文两种语言环境,则可以配置两个国际化资源文件,内容如下:
中文环境下的国际化资源文件
this.is.chinese=这里是中文
英文环境下的国际化资源文件
this.is.chinese=ThisisChineseI18n.getValue会根据当前的语言环境(中文或英文)访问合适的国际化资源文件,并根据关键字获得国际化资源文本,从而实现国际化功能。
Java注解(Annotation)是JDK5.0开始引入的一种特殊的注释机制,例如下面的代码定义了一个名为UserName的注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public@interfaceUserName
{
Stringvalue()default"";
}
其中,@Retention、@Target是作用在注解上的注解,称为元注解,注解中可以包含若干属性项,类似于类包含的成员变量,比如这里的value就是注解UserName包含的属性项,注解的属性项可以设置默认值,即default之后的内容,上述代码中value的默认值为空字串。
在Java应用的开发过程中,有时需要对Java注解进行国际化,例如:
其中,注解UserName被应用到业务类User的方法get上,同时上述代码还对注解UserName的属性项value进行了赋值("公司用户"),所谓对Java注解的国际化实质上就是对注解的某些属性进行国际化,如这里的value。例如,希望在中文环境下value的属性值为"公司的用户",在英文环境下value的属性值为"User of Company"。然而,发明人发现,直接套用现有的国际化方法是不可行的,例如:
注解UserName所在的行在编译时会报错,原因是不能将注解的属性项的属性值设置为一个非常量表达式。
针对Java注解的国际化,在现有技术中还没有对应的解决方案。虽然可以通过将国际化相关的逻辑从注解移至普通的Java代码中来回避这一问题,但终究会导致开发不便。
针对上述问题,本申请提出一种注解国际化方法,利用Java的反射机制实现Java注解的国际化,方案的具体细节将在后文阐述。需要指出,现有技术中存在的上述缺陷,是发明人在经过实践并仔细研究后得出的结果,因此上述问题的发现过程以及所提出的注解国际化方法,都应视为发明人在发明过程中对本发明做出的贡献。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
为使得本申请的方案便于理解,首先举一个注解国际化的例子,后文在阐述注解国际化方法时,也基本上基于该例子进行阐述。
业务需求:在某Java应用的界面上需要显示姓名、经纬度两项信息,并且需要对这两项信息的标题文本做国际化处理,即在不同的语言环境显示不同语言的文本,比如在中文环境下显示“姓名”、“经纬度”(如图1所示),在英文环境下显示“Name”、“Longtitude andLatitude”(图未示出)。
为实现界面显示,可以定义一个业务类User,如下:
该类包括两个名为name和position的属性(私有成员),分别表示界面上显示的具体姓名(如“张某某”)以及具体经纬度(如“东经:104.0/北纬:30.67”)。属性name具有一个注解OwnerAnn,表示姓名这项信息在界面上需要显示的标题文本(如图1中的文本“姓名”),属性position也具有一个注解ThridAnn,表示经纬度这项信息在界面上需要显示的标题文本(如图1中的文本“经纬度”)。其中,OwnerAnn是一个自定义注解,而ThridAnn是一个第三方注解,自定义注解包含的属性项可以由Java应用的开发者自行定义而第三方注解则不行,在一些实现方式中,对于自定义注解的国际化和对于第三方注解的国际化存在区别,因此在该例子中将两种注解都列出来方便后文阐述。
需要指出,上面的代码为未进行注解国际化时的代码,注解国际化后的代码将在后文给出。
在执行本申请实施例提供的注解国际化方法前,需要先对自定义注解进行定义,代码如下:
其中,public@interface是Java中注解的标准定义方式。OwnerAnn包括两个元注解,分别是@Retention和@Target,@Retention定义注解的生命周期,在本申请的方案中必须指定为运行时(RUNTIME),这样注解信息才会保存在编译好的.class文件中,并且在JVM加载.class文件后仍然存在,这样应用程序运行时才能够对注解对象进行访问,@Target表明注解OwnerAnn应用的目标对象,这里的FIELD表示注解OwnerAnn必须应用在某个属性上(如User.name),当然@Target也可以指定其他值,如ElementType.METHOD(表示注解OwnerAnn必须应用在某个方法上)、ElementType.TYPE(表示注解OwnerAnn必须应用在某个类型上,这里的类型可以是类、接口、枚举类型等),若不包含元注解@Target,则应用注解OwnerAnn的目标对象不受限制。可以理解的,OwnerAnn还可以包含其他元注解。
OwnerAnn包含两个属性项,分别是name和i18nClass,下面分别介绍:
name对应界面上姓名这一信息项的标题文本,name具有默认的属性值"i18n:name,姓名",其中字串"i18n:name"可分为两个部分看待,第一部分"i18n"是一个专门供注解国际化使用的标识字串,若注解中的某个属性项的属性值中包含该字串,表明该属性项需要进行国际化,否则,表明该属性项不需要进行国际化,后文有时也将需要进行国际化的属性项简称为目标属性项。可以理解的,标识字串也可以是其他字串,并不一定要是"i18n",标识字串也不一定要位于属性值的开始位置。
第二部分"name"是一个关键字,用于索引国际化资源文件中的国际化资源文本。例如,满足上述需求的国际化资源文件可以包括两个:
中文环境下的国际化资源文件
name=姓名
position=经纬度
英文环境下的国际化资源文件
name=Name
position=Longtitude and Latitude
假设当前的语言环境是英文,那么访问英文环境下的国际化资源文件,并根据关键字"name"就可以获取到所需的国际资源文本"Name","Name"也就是英文环境下界面上姓名这一信息项需要显示的标题文本。
至于name的默认值中的"姓名"表示界面上默认显示的标题文本,比如,在无法获取到当前的语言环境时,可以在界面上姓名这一信息项处显示该文本,或者也可以认为其是国际化资源文本的默认值。
注意,并不一定每个属性项都需要进行国际化,需要国际化的主要是与界面显示有关的属性项。另外,以上代码中指定的只是name的默认值,在注解OwnerAnn被应用到目标对象上时,还可以为name重新赋值(详见后文代码),但为name赋值同样遵循上面的原则,即对于需要进行国际化的属性项,其属性值中需要包含标识字串以及关键字,对于不需要进行国际化的属性项,其属性值中不应包含标识字串。另外,在一些实现方式中,注解的属性项也可以不指定默认值,属性项的属性值都通过赋值来获得。
i18nClass称为业务类属性项,该属性项的默认值为Object.class,在注解OwnerAnn被应用到目标对象上时,i18nClass应当被重新赋值为使用注解OwnerAnn的业务类(详见后文代码),比如OwnerAnn在业务类User中使用,则i18nClass的属性值应当被设置为User.class,属性项i18nClass的用途在后文说明。可以理解的,业务类属性项的名称不一定是i18nClass。
以上介绍了自定义注解,对于第三方注解,在本申请的方案中也应选择生命周期为RUNTIME的注解,其可能的定义方式如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public@interfaceThirdAnn
{
String trap()default"";
}
注解ThirdAnn包含属性项trap,trap对应界面上经纬度这一信息项的标题文本,trap默认的属性值为空字串。由于ThirdAnn是第三方定义的,Java应用的开发人员只是使用该注解,所以无法在其中添加业务类属性项,也不一定能够修改属性项trap的默认值,但可以在Java应用中为trap赋值,赋值原则同注解OwnerAnn中name属性项的赋值原则。
为实现界面文本的国际化显示,业务类User可以定义如下:
在上面的代码中,对注解OwnerAnn的属性项name、i18nClass进行了赋值,以及对ThirdAnn的属性项trap进行了赋值。
业务类的代码可以归类存放,例如根据其功能存放在某个包(对应一个文件夹)下,在一些实现方式中,为便于管理,国际化资源文件可以和业务类的代码文件放在同一个包下,并且可以在文件名中包含业务类的名称,如User.properties,便于在进行注解国际化时找到该文件。
图2示出了本申请实施例提供的一种注解国际化方法的流程图。该方法可以由但不限于由一电子设备执行,图4示出了该电子设备的一种可能的结构,具体可参考后文关于图4的描述。参照图2,该方法包括:
步骤S110:通过Java的反射机制读取业务类包含的注解对象。
例如,在Java应用运行时,创建了业务类User的一个对象user,则通过如下代码可以得到OwnerAnn注解对象:
FieldnameField=user.getClass().getDeclaredField(“name”);
Annotation[]anns=nameField.getAnnotations();
其中,第一行代码得到User的属性name,第二行代码得到属性name对应的全部注解对象,这里只有OwnerAnn注解对象,同理也可以得到ThirdAnn对象。
注解国际化方法的步骤可以在包含注解的业务类使用之前执行(例如,在Java应用的界面展现之前)执行,此时,当前的语言环境为Java应用上次启动时配置好的语言环境(若Java应用首次启动,可以是一个默认的语言环境)。注解国际化方法的步骤也可以在Java应用监测到语言环境发生变化时执行(例如,用户修改了软件语言环境的配置),此时,当前的语言环境为修改配置后的语言环境。
步骤S120:确定注解对象包含的属性项中需要国际化的目标属性项,并获取针对目标属性项的国际化资源文本。
在得到注解对象后,通过Java的反射机制可以获取到注解对象包含的全部属性项,根据前文阐述,在一些实现方式中,需要国际化的目标属性项的属性值中都包含特定的标识字串,从而在对注解对象进行解析时根据该标识字串就可以确定某个属性项是否需要国际化。若一个注解对象的所有属性项都不包含该标识字串,则说明该注解无需国际化。
例如,name属性项的属性值为"i18n:name,姓名",其中包含字串"i18n",从而可以确定该属性项为一个目标属性项,类似地也可以确定trap属性项为一个目标属性项。
在另一些实现方式中,也可以在注解中定义额外的属性项来指明其他属性项是否需要进行国际化,只是直接通过属性值来判断某个属性项是否需要国际化会更简单一些。
前文已经提到,国际化资源文件配置好后,可以在其文件名中包含业务类的名称,并和业务类的代码文件保存在同一个包下。此时,国际化资源文件的完整保存路径(包括包名和文件名)可由业务类的包名称、业务类的名称以及当前的语言环境三项信息共同确定。例如:
方式一:
cn/com.xxx/User.properties
en/com.xxx/User.properties
其中,cn/com.xxx和en/com.xxx都是业务类User的包名称(该业务类的代码文件同时包含在两个包中),cn表示中文环境,从而cn/com.xxx是存放中文国际化资源文件User.properties的包,en表示英文环境,从而en/com.xxx是存放英文国际化资源文件User.properties的包。即方式一中业务类的包名称和语言环境共同决定了国际化资源文件存放的包名,而业务类的名称决定了国际化资源文件的文件名。
方式二:
com.xx/cn.User.properties
com.xx/en.User.properties
其中,com.xxx是业务类User的包名称(该业务类的代码文件只包含在一个包中),该包下包含两个国际化资源文件,分别是cn.User.properties和en.User.properties,cn表示中文环境,从而cn.User.properties是中文国际化资源文件,en表示英文环境,从而en.User.properties是英文国际化资源文件。即方式二中业务类的包名称决定了国际化资源文件存放的包名,而语言环境和业务类的名称共同决定了国际化资源文件的文件名。
要进行注解国际化,必须获得国际化资源文件中针对注解的目标属性项的国际化资源文本,根据上面的分析,只要获得了业务类的包名称、业务类的名称以及当前的语言环境三项信息,就可以获得国际化资源文件,例如,对于方式一,根据业务类的包名称cn/com.xxx和en/com.xxx、当前的语言环境cn以及业务类的名称User,就可以唯一确定中文国际化资源文件的完整保存路径cn/com.xxx/User.properties,进而可以对中文国际化资源文件进行读取;对于方式二,根据业务类的包名称com.xxx、当前的语言环境cn以及业务类的名称User,就可以唯一确定中文国际化资源文件的完整保存路径com.xxx/cn.User.properties,进而可以对中文国际化资源文件进行读取。
读取国际化资源文件时,根据目标属性项的属性值中包含的关键字查询国际化资源文件中与之关联的字串,得到的字串即为国际化资源文本。例如,name属性项中包含的关键字"name",当前语言环境为中文,根据该关键字查找cn/com.xxx/User.properties,就可以得到国际化资源文本“姓名”;又例如,trap属性项中包含的关键字"position",当前语言环境为英文,根据该关键字查找com.xxx/en.User.properties,就可以得到国际化资源文本“Longtitude and Latitude”。
在业务类的包名称、业务类的名称、当前的语言环境三项信息中,当前的语言环境取决于Java应用的配置,前两项信息只要在获得业务类后都可以得到。
得到业务类有不同的方法,例如,对于自定义注解OwnerAnn,由于其中定义了业务类属性项i18nClass,并且在业务类User定义时,该属性项被赋值为User.class,所以直接读取i18nClass的属性值就可以了。而对于第三方注解ThirdAnn,由于其中没有定义业务类属性项,所以只能通过Java的反射机制来得到业务类,例如,user.getClass()。至于如何确定一个注解对象属于自定义注解还是第三方注解,只需检测该注解对象是否包含业务类属性项i18nClass即可,例如,可以通过Java的反射机制遍历注解对象的全部属性项并根据属性项名称判断。
可以理解的,对于自定义注解,也可以不定义业务类属性项而通过Java的反射机制来得到业务类,但定义业务类属性项有利于简化程序的处理逻辑。例如,在一些实现方式中,负责国际化资源加载和访问的代码逻辑被实现为一个单独的软件模块,不妨称为国际化资源管理单元,负责解析、设置注解对象的代码逻辑被实现为另一个软件模块,不妨称为注解分析单元;国际化资源管理单元在进行注解国际化之前先将国际化资源文件加载到内存,以加快对这些文件的访问速度,当然此时仍可由上述三项信息确定要访问的国际化资源文件。在注解分析单元需要获取国际化资源文本时,向国际化资源管理单元发送请求即可,对于自定义注解,可以这样发送请求:
parseField(nameField);
其中,parseField属于国际化资源管理单元中的函数,nameField中包含了自定义注解对象(通过反射即可获取,前文已给出代码),国际化资源管理单元根据自定义注解对象即可自行解析获得业务类。
对于第三方注解,则需要这样发送请求:
parseField(nameField,user.getClass());
可见,第三方注解必须向国际化资源管理单元传递业务类作为参数,否则国际化资源管理单元仅根据第三方注解对象无法获得业务类。若parseField中调用了更多的函数,则可能会有更多的函数需要通过参数来传递业务类。因此,若在自定义注解中定义业务类属性项,有利于减少参数传递,提高代码的执行效率,甚至于简化代码(比如,在不使用第三方注解时可以不开发包含业务类参数的parseField函数)。
步骤S130:通过Java的反射机制将目标属性项的属性值设置为国际化资源文本。
例如,注解对象为annotation,则可以通过如下代码设置属性项name的属性值:
InvocationHandlerinvocationHandler=
Proxy.getInvocationHandler(annotation);
Fieldvalues=
invocationHandler.getClass().getDeclaredField("memberValues");
values.setAccessible(true);
Map memberValues=(Map)values.get(invocationHandler);
memberValues.put("name","Name");
其中,假设语言环境为英文,属性项name对应的国际化资源文本为"Name",代码的最后一行完成了属性值的重新设置。类似地,也可以将属性项trap对应的属性值重新设置为"Longtitude and Latitude"。
注意,如果Java应用只需要在启动时进行一次注解国际化,启动后不支持动态修改语言环境,则可以按照上述代码执行,但如果Java应用支持动态修改语言环境,则可以将最后一行调整为:
memberValues.put("name","i18n:name,Name");
即保留标识字串"i18n",便于因更换语言环境而重新进行注解国际化时仍然能够识别出该属性为目标属性。
注解对象的目标属性的属性值重新设置后,根据新的属性值进行界面显示,即实现了界面文本的国际化显示。但注意,本申请的方案并不限定国际化后的注解的用途,即国际化后的注解不一定要用于界面显示。
综上所述,本申请实施例提供的注解国际化方法在Java应用的运行过程中,利用Java的反射机制读取注解对象,并利用Java的反射机制将注解对象中的目标属性项的属性值设置为国际化资源文本,从而实现了对目标属性项的属性值的国际化。该方法提供了一种针对Java注解进行国际化的解决方案,该方案简单高效,便于开发人员使用。
图3示出了本申请实施例提供的注解国际化装置200的功能模块图。
参照图3,注解国际化装置200包括:
注解对象获取模块210,用于通过Java的反射机制读取业务类包含的注解对象;
资源获取模块220,用于确定所述注解对象包含的属性项中需要国际化的目标属性项,并获取针对所述目标属性项的国际化资源文本;
国际化模块230,用于通过Java的反射机制将所述目标属性项的属性值替换为所述国际化资源文本。
在注解国际化装置200的一种实现方式中,资源获取模块220确定所述注解对象包含的属性项中需要国际化的目标属性项,包括:通过Java的反射机制读取所述注解对象包含的属性项,并将属性值中包含有特定的标识字串的属性项确定为所述目标属性项。
在注解国际化装置200的一种实现方式中,资源获取模块220获取针对所述目标属性项的国际化资源文本,包括:获取所述业务类;根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件;从所述国际化资源文件中读取与所述目标属性项的属性值中包含的关键字对应的所述国际化资源文本。
在注解国际化装置200的一种实现方式中,资源获取模块220获取所述业务类,包括:判断所述注解对象中是否包含业务类属性项;若包含所述业务类属性项,则读取所述业务类属性项的属性值,该属性值被设置为所述业务类;若不包含所述业务类属性项,则通过Java的反射机制获取所述业务类。
在注解国际化装置200的一种实现方式中,资源获取模块220根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件,包括:根据所述业务类的包名称以及当前的语言环境确定所述国际化资源文件的存放路径,根据所述业务类的名称确定所述国际化资源文件的文件名称;或者,根据所述业务类的包名称确定所述国际化资源文件的存放路径,根据所述业务类的名称以及当前的语言环境确定所述国际化资源文件的文件名称。
本申请实施例提供的注解国际化装置200,其实现原理及产生的技术效果在前述方法实施例中已经介绍,为简要描述,装置实施例部分未提及之处,可参考方法实施例中相应内容。
图4示出了本申请实施例提供的电子设备300的一种可能的结构。参照图4,电子设备300包括:处理器310、存储器320以及通信接口330,这些组件通过通信总线340和/或其他形式的连接机构(未示出)互连并相互通讯。
其中,存储器320包括一个或多个(图中仅示出一个),其可以是,但不限于,随机存取存储器(Random Access Memory,简称RAM),只读存储器(Read Only Memory,简称ROM),可编程只读存储器(Programmable Read-Only Memory,简称PROM),可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,简称EPROM),电可擦除可编程只读存储器(Electric Erasable Programmable Read-Only Memory,简称EEPROM)等。处理器310以及其他可能的组件可对存储器320进行访问,读和/或写其中的数据。
处理器310包括一个或多个(图中仅示出一个),其可以是一种集成电路芯片,具有信号的处理能力。上述的处理器310可以是通用处理器,包括中央处理器(CentralProcessing Unit,简称CPU)、微控制单元(Micro Controller Unit,简称MCU)、网络处理器(Network Processor,简称NP)或者其他常规处理器;还可以是专用处理器,包括图形处理器(Graphics Processing Unit,简称GPU)、数字信号处理器(Digital Signal Processor,简称DSP)、专用集成电路(Application Specific Integrated Circuits,简称ASIC)、现场可编程门阵列(Field Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
通信接口330包括一个或多个(图中仅示出一个),可以用于和其他设备进行直接或间接地通信,以便进行数据的交互。通信接口330可以包括进行有线和/或无线通信的接口。
在存储器320中可以存储一个或多个计算机程序指令,处理器310可以读取并运行这些计算机程序指令,以实现本申请实施例提供的注解国际化方法以及其他期望的功能。
可以理解,图4所示的结构仅为示意,电子设备300还可以包括比图4中所示更多或者更少的组件,或者具有与图4所示不同的配置。图4中所示的各组件可以采用硬件、软件或其组合实现。电子设备300可能是实体设备,例如PC机、笔记本电脑、平板电脑、手机、服务器、嵌入式设备等,也可能是虚拟设备,例如虚拟机、虚拟化容器等。并且,电子设备300也不限于单台设备,也可以是多台设备的组合或者大量设备构成的集群。
本申请实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序指令,所述计算机程序指令被计算机的处理器读取并运行时,执行本申请实施例提供的注解国际化方法。例如,计算机可读存储介质可以实现为图4中电子设备300中的存储器320。
以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (8)
1.一种注解国际化方法,其特征在于,包括:
通过Java的反射机制读取业务类包含的注解对象;
确定所述注解对象包含的属性项中需要国际化的目标属性项,并获取针对所述目标属性项的国际化资源文本;
通过Java的反射机制将所述目标属性项的属性值设置为所述国际化资源文本;
所述确定所述注解对象包含的属性项中需要国际化的目标属性项,包括:
通过Java的反射机制读取所述注解对象包含的属性项,并将属性值中包含有特定的标识字串的属性项确定为所述目标属性项。
2.根据权利要求1所述的注解国际化方法,其特征在于,所述获取针对所述目标属性项的国际化资源文本,包括:
获取所述业务类;
根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件;
从所述国际化资源文件中读取与所述目标属性项的属性值中包含的关键字对应的所述国际化资源文本。
3.根据权利要求2所述的注解国际化方法,其特征在于,所述获取所述业务类,包括:
判断所述注解对象中是否包含业务类属性项;
若包含所述业务类属性项,则读取所述业务类属性项的属性值,该属性值被设置为所述业务类;
若不包含所述业务类属性项,则通过Java的反射机制获取所述业务类。
4.根据权利要求2所述的注解国际化方法,其特征在于,所述根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件,包括:
根据所述业务类的包名称以及当前的语言环境确定所述国际化资源文件的存放路径,根据所述业务类的名称确定所述国际化资源文件的文件名称;或者,
根据所述业务类的包名称确定所述国际化资源文件的存放路径,根据所述业务类的名称以及当前的语言环境确定所述国际化资源文件的文件名称。
5.一种注解国际化装置,其特征在于,包括:
注解对象获取模块,用于通过Java的反射机制读取业务类包含的注解对象;
资源获取模块,用于确定所述注解对象包含的属性项中需要国际化的目标属性项,并获取针对所述目标属性项的国际化资源文本;
国际化模块,用于通过Java的反射机制将所述目标属性项的属性值替换为所述国际化资源文本;
资源获取模块确定所述注解对象包含的属性项中需要国际化的目标属性项,包括:
通过Java的反射机制读取所述注解对象包含的属性项,并将属性值中包含有特定的标识字串的属性项确定为所述目标属性项。
6.根据权利要求5所述的注解国际化装置,其特征在于,资源获取模块获取针对所述目标属性项的国际化资源文本,包括:
获取所述业务类;
根据所述业务类的包名称、所述业务类的名称以及当前的语言环境确定国际化资源文件;
从所述国际化资源文件中读取与所述目标属性项的属性值中包含的关键字对应的所述国际化资源文本。
7.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序指令,所述计算机程序指令被处理器读取并运行时,执行如权利要求1-4中任一项所述的注解国际化方法。
8.一种电子设备,其特征在于,包括存储器以及处理器,所述存储器中存储有计算机程序指令,所述计算机程序指令被所述处理器读取并运行时,执行权利要求1-4中任一项所述的注解国际化方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010674173.7A CN111651221B (zh) | 2020-07-14 | 2020-07-14 | 注解国际化方法及装置、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010674173.7A CN111651221B (zh) | 2020-07-14 | 2020-07-14 | 注解国际化方法及装置、存储介质及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111651221A CN111651221A (zh) | 2020-09-11 |
CN111651221B true CN111651221B (zh) | 2022-09-20 |
Family
ID=72347673
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010674173.7A Active CN111651221B (zh) | 2020-07-14 | 2020-07-14 | 注解国际化方法及装置、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111651221B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112328432A (zh) * | 2020-11-09 | 2021-02-05 | 杭州安恒信息技术股份有限公司 | 文件事务管理方法、系统、存储介质及计算机设备 |
CN112835565A (zh) * | 2021-01-29 | 2021-05-25 | 山东浪潮通软信息科技有限公司 | 一种生成组件配置器的方法、设备和存储介质 |
CN114238015A (zh) * | 2021-12-13 | 2022-03-25 | 成都新希望金融信息有限公司 | 一种更新属性方法、装置、电子设备及存储介质 |
CN114327610A (zh) * | 2021-12-20 | 2022-04-12 | 特赞(上海)信息科技有限公司 | 注解国际化方法、装置、终端及存储介质 |
CN115455239B (zh) * | 2022-11-10 | 2023-01-06 | 北京易诚互动网络技术股份有限公司 | 一种java类实例和目标格式数据的转换方法和装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101606150A (zh) * | 2007-01-03 | 2009-12-16 | 甲骨文国际公司 | 基于可扩展标记语言的翻译 |
CN109871251A (zh) * | 2019-01-17 | 2019-06-11 | 平安科技(深圳)有限公司 | 一种响应数据的处理方法、装置、存储介质及终端设备 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8813046B2 (en) * | 2012-03-23 | 2014-08-19 | Infosys Limited | System and method for internationalization encoding |
CN104536769A (zh) * | 2015-01-16 | 2015-04-22 | 浪潮电子信息产业股份有限公司 | 一种国际化文档实现方法 |
CN106682242A (zh) * | 2017-02-20 | 2017-05-17 | 山东浪潮商用系统有限公司 | 一种海外项目自定义国际化标签和日期数字的格式化方法 |
WO2019071406A1 (zh) * | 2017-10-10 | 2019-04-18 | 深圳中兴力维技术有限公司 | 前端页面国际化处理方法、应用服务器及计算机可读存储介质 |
CN109683998B (zh) * | 2017-10-19 | 2022-04-26 | 北京京东尚科信息技术有限公司 | 国际化实现方法、装置和系统 |
CN111367595B (zh) * | 2018-12-25 | 2024-03-26 | 阿里巴巴集团控股有限公司 | 数据处理方法、程序运行方法、装置及处理设备 |
CN111367976B (zh) * | 2020-02-28 | 2024-07-05 | 深圳平安医疗健康科技服务有限公司 | 基于java反射机制的excel文件数据的导出方法及装置 |
-
2020
- 2020-07-14 CN CN202010674173.7A patent/CN111651221B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101606150A (zh) * | 2007-01-03 | 2009-12-16 | 甲骨文国际公司 | 基于可扩展标记语言的翻译 |
CN109871251A (zh) * | 2019-01-17 | 2019-06-11 | 平安科技(深圳)有限公司 | 一种响应数据的处理方法、装置、存储介质及终端设备 |
Non-Patent Citations (1)
Title |
---|
基于领域驱动设计的物流平台系统实现;丁涛;《中国优秀硕士学位论文全文数据库 (信息科技辑)》;20110415;第I138-245页 * |
Also Published As
Publication number | Publication date |
---|---|
CN111651221A (zh) | 2020-09-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111651221B (zh) | 注解国际化方法及装置、存储介质及电子设备 | |
US11461111B2 (en) | Method for running applets, and electronic device | |
US9934005B2 (en) | Dynamically building locale objects or subsections of locale objects based on historical data | |
US10228933B2 (en) | Resource deployment based on conditions | |
US7114148B2 (en) | Runtime services for network software platform | |
RU2611966C2 (ru) | Рекомендательная система для пополнения данных | |
CN113126990B (zh) | 一种页面开发方法、装置、设备及存储介质 | |
US6882353B2 (en) | Transmission of locale information | |
JPH0926924A (ja) | 分散オブジェクトシステムにおける例外を解釈する方法および装置 | |
US7568196B2 (en) | Initializing virtual machine that subsequently executes application | |
CN112114805B (zh) | 页面生成方法、装置、设备 | |
US20080141219A1 (en) | Multiple inheritance facility for java script language | |
CN110795454A (zh) | 一种服务请求方法、装置、服务器及存储介质 | |
US9141353B2 (en) | Dynamically building locale objects at run-time | |
CN115982199A (zh) | 数据查询方法、服务器、设备及存储介质 | |
CN117009397A (zh) | 数据查询方法、数据查询装置、电子设备和存储介质 | |
US20060143593A1 (en) | Runtime string population in help files | |
CN113342399B (zh) | 应用项目的结构配置方法、装置及可读存储介质 | |
CN112148450A (zh) | 数据处理方法、装置、设备和存储介质 | |
CN115525305A (zh) | 数据处理、应用启动方法、装置、计算机设备和存储介质 | |
US6658647B1 (en) | Access to resource files stored in ROM | |
CN113515326B (zh) | 数据转换方法、装置、电子设备以及存储介质 | |
CN115269058B (zh) | 一种wpf资源加载方法及装置 | |
US11847477B1 (en) | Techniques for natively interpreting logic across disparate platforms | |
CN117632867A (zh) | 查询组件的生成方法、生成装置和计算机可读存储介质 |
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 |