我需要编码一个方法,比如:
MyClassObject convert(Class MyClass , String value)
convert方法的工作是将String转换为MyClass的对象,其中MyClass可以是任何东西(除了基元)-Integer、Boolean、Character、Date。。。这里的可能性很大——这就是我放弃愚蠢的if-else块来单独处理所有案件的原因。
我可以在C#中看到与此相关的东西(不知道它是否有效),不知道我们是否有与此或此等效的Java
我知道不是所有东西都可以从字符串转换,我已经准备好处理不可解析项的异常。
我不知道这是否可能。如果没有,请帮助我为我的代码提供一个合适的设计模式。
谢谢!
您最好的选择可能是ServiceLoader
机制。这允许您定义一对接口,例如:
interface StringConverterProvider{
StringConverter<T> getConverterFor(Class<T> clazz);
}
interface StringConverter<T>{
T convert(String s);
}
然后定位运行时可用的这些接口的所有实现,比如:
ServiceLoader<StringConverterProvider> converterProviderLoader
= ServiceLoader.load(StringConverterProvider.class);
T convert(String s, Class<T> t){
for(StringConverterProvider scProv : converterProviderLoader){
StringConverter<T> converter = scProv.getConverterFor(t);
if (converter != null)
return converter.convert(s);
}
return null;
}
通过在jar
文件的META-INF
目录中的一个特殊文件中列出接口,可以使接口的实现对ServiceLoader
可用;有关详细信息,请参阅javadoc。
使用反射并希望基元的所有包装对象都包含一个带有值字符串参数的构造函数,您可以像下面的一样实现这一点
// A sample test with main
public static void main(String[] args) {
Object obj = create(Integer.class, "54896");
Integer val = (Integer) obj;
System.out.println(val);
}
// Method to create the desired object with the given value
private static Object create(Class myClass, String value) {
Object obj = null;
try {
Constructor constructor = myClass.getConstructor(new Class[]{String.class});
obj=constructor.newInstance(value);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}