今天同事和我讨论他遇到的一个问题。具体要求是这样的,在运行时,我们会从模块G得到一个Map,这个Map里面都是一些字符串对,你可以理解成一个字典,有字符串的key和字符串的value。简短节说,就是
Map<String, String>
非常非常复杂深奥。
好,现在我们事先知道要从这个map里读取一些数据点,比如:id, name, sex等等。
对id,我们知道读出来的是int;对name,是string;对sex,应该对应一个叫Gender的enum类型。
这就涉及一个自动类型转换的问题。我们希望不用对每个数据点做手工类型转换。
另外一个需求,一些数据点是有缺省值的。比如name我们可以缺省为空字符串。
这样,如果map里面没有某个值,我们就看缺省值,如果有,就用这个缺省值,如果没有,就抛异常。
手工做的话,大概是这样:
String idValue = map.get("id");
if (idValue == null) {
throw ...;
}
int id = Integer.parseInt(idValue);
String name = map.get("name");
if (name == null) {
name = "";
}
String sexValue = map.get("sex");
if (sexValue == null) {
throw ...;
}
Gender sex = Gender.valueOf(sexValue);
...
比较痛苦。于是做了一个动态代理:
public final class PropertyConverter<T> {
private final Class<T> targetType;
private PropertyConverter(Class<T> targetType) {...}
public static <T> PropertyConverter<T> to(Class<T> targetType) {
return new PropertyConverter<T>(targetType);
}
public T from(final Map<String, String> map) {
return Proxy.newProxyInstance(
new Class[]{targetType}, targetType.getClassLoader(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) {
String value = map.get(method.getName());
if (value == null) {
Object defaultValue = method.getDefaultValue();
if (defaultValue == null) {
throw ...;
}
return defaultValue;
}
return convert(value, method.getReturnType());
}
});
}
}
convert()函数是调用apache的ConvertUtilsBean做的,没什么说的。
那么,用法呢?
@interface Foo {
int id();
String name() default "";
Gender sex();
}
Map<String, String> map = ...;
Foo foo = PropertyConverter.to(Foo.class).from(map);
foo.id();
foo.name();
这里面,对annotation的用法比较特别。不过不这么做,java也不提供一个简单并且类型安全的指定缺省值的方法。当然,如果你凑巧不需要缺省值,那么也不用annotation,直接用interface就好。
分享到:
相关推荐
在IT行业中,数据管理和配置管理经常涉及到不同格式的文件转换,比如Excel和Properties文件。Excel是一种广泛用于数据处理和分析的电子表格工具,而Properties文件则常见于Java开发中,用于存储配置信息。两者之间的...
为了解决这个问题,开发人员通常需要使用特定的工具来批量处理和转换`.properties`文件,以确保它们正确地支持中文字符。 本话题将介绍一种Java `.properties`中文资源批量转换工具的使用方法,帮助开发者高效地...
此文件可以批量的将properties转换成json字符串并输出为txt文件. 使用:PropToJson.toJSONString(resourseArr,true) resourseArr为资源文件地址数组 true为对应txt文件到本地; false为不输出到本地
"properties资源文件转换插件"是一款专为Eclipse开发环境设计的工具,旨在简化对.properties配置文件进行中文转换的过程。通常,在Java开发中,.properties文件用于存储应用程序的配置信息,如国际化(i18n)的文本。...
java_properties编辑器支持自动转换ascii,方便快捷无需再用JDK自动工具转换。
使用 native2ascii 工具可以将 Properties 文件转换为 Unicode 编码字符的文件,然后将转换后的文件内容替换为原始文件的内容。这样可以解决 Properties 文件文中乱码问题。 Properties 文件是一种资源文件,用于...
4. **将Properties转换为Map** `Properties`类本身就是一个`Map`,可以直接通过`entrySet()`方法访问键值对。但如果你需要一个标准的`Map, String>`,可以进行转换: ```java Map, String> map = new HashMap(); ...
2. **自动编码检测和转换**:该插件能够自动检测`.properties`文件的编码,并允许用户选择不同的字符集进行转换,确保国际化文本的正确显示。 3. **支持Unicode和特殊字符**:由于国际化的需要,Properties Editor...
博主分享了一个实用的方法,即通过Unicode转换工具来处理含有中文字符的properties文件,以确保数据的正确性。 首先,我们需要理解Java Properties文件的编码问题。默认情况下,Java Properties类在读取和写入文件...
利用java的反射解析Properties文件转成对象 /** * 解析properties文件为对象 * @param * @param propPath * @param cls * @return * @throws InstantiationException * @throws ...
有时候,将.properties文件转换为JSON格式会更方便,因为JSON与JavaScript天生兼容。可以使用在线工具或者自定义脚本完成转换,然后在JavaScript中使用`JSON.parse()`来解析。 7. **错误处理** 在处理文件读取和...
Properties Editor是一款专为Eclipse开发的插件,主要用于编辑Struts2框架中的资源文件,尤其在处理Unicode编码和中文字符转换方面提供了极大的便利。这款插件解决了开发人员在使用Eclipse进行国际化(i18n)开发时...
yml properties相互转换 工具 java小工具 命令:java -jar properties-yml.jar application.properties 生成application.properties 命令:java -jar properties-yml.jar application.yml 生成application.yml
以下是一个简单的示例,展示如何使用Properties类加载文件并将其内容转换为Map: ```java import java.io.*; import java.util.*; public class PropertyHandler { public static Map, String> loadProperties...
这个问题通常由两个主要因素引起:编码格式不匹配和读写过程中的编码转换不当。 首先,Properties文件默认使用ISO-8859-1编码,这是Java的标准编码。如果在文件中直接写入中文,而编辑器或程序以UTF-8或其他支持...
将Java .properties文件转换为JSON(使用JavaScript)。 函数propertiesToJSON接受一个字符串并返回一个JavaScript对象。 读取node的本地文件: const fs = require ( "fs" ) ; const path = require ( "path" ) ;...
1. **预处理**:在编辑`.properties`文件时,可以使用Java提供的`native2ascii`工具或Eclipse的属性编辑器将中文字符转换为对应的UTF-8编码表示形式。 2. **程序中转换**:在代码中,可以使用`new String...
然而,尽管Eclipse本身已经提供了对`properties`文件的基本编辑功能,但有时开发者可能需要更高级的功能,如语法高亮、自动完成、编码转换等,这就是`myeclipse插件properties插件`的作用。 这个插件专为解决`...
2. **编码检测与转换**:插件可以自动检测文件的编码,并允许用户转换文件的编码格式,以适应不同的项目需求。 3. **语法高亮**:通过颜色区分关键字和普通文本,提高代码可读性。 4. **自动完成**:提供属性键的...
- 如果需要将读取出的时间字符串转换回日期对象,可以使用`SimpleDateFormat.parse`或`java.time.format.DateTimeFormatter.parse`方法。例如: ```java try { Date lastUpdateTime = new SimpleDateFormat(...