Ho un java.lang.reflect.InvocationHandler
e ho bisogno di implementare il metodo invoke()Come convertire da stringa a un tipo primitivo o tipi wrapper Java standard
ho un valore di tipo java.lang.String
dalla mia elaborazione e ho bisogno di convertire questo valore al returnType appropriato previsto dal metodo (può essere primitivo come int, boolean, double o wrapper come Boolean, Integer, Double, Float, ecc.).
Esempio:
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String computedValue = compute(...);
return convert(method.getReturnType(), computedValue);
}
private Object convert(Class<?> returnType, String stringValue) {
return ...; // what's the simplest way?
}
Non mi aspetto di implementare semplicemente una conversione automatica tra oggetti complessi, ma mi aspetto un modo semplice per convertire da stringa ai tipi standard di Java.
che ho visto (troppo) molte volte cose come questa, ma non sembra appropriato per me:
public static Object toObject(Class clazz, String value) {
if(Boolean.class.isAssignableFrom(clazz)) return Boolean.parseBoolean(value);
if(Byte.class.isAssignableFrom(clazz)) return Byte.parseByte(value);
if(Short.class.isAssignableFrom(clazz)) return Short.parseShort(value);
if(Integer.class.isAssignableFrom(clazz)) return Integer.parseInteger(value);
if(Long.class.isAssignableFrom(clazz)) return Long.parseLong(value);
if(Float.class.isAssignableFrom(clazz)) return Float.parseFloat(value);
if(Double.class.isAssignableFrom(clazz)) return Double.parseDouble(value);
return value;
}
e quanto sopra non è nemmeno il peggiore che ho visto, finora :)
Qualcuno ha un trucco segreto qui?
Dicci: 1. Perché il tuo primo esempio non funziona, e 2. Che cosa "non sembra appropriato" significa. –
1. il primo esempio non funziona perché nel metodo di conversione manca l'implementazione (che è l'argomento soggetto per questa domanda) 2. non sembra appropriato significa che a mio parere questa implementazione è piuttosto brutta a causa di i molti se, e suppongo che ci sia un modo migliore per fare questo lavoro. –
Poiché il secondo esempio * funziona * (ma è solo brutto), http://codereview.stackexchange.com potrebbe essere un'opzione migliore. – luiscubal