我正在开发使用JSP构建的旧版Web应用程序。我被要求在代码中用BigDecimal替换double。我知道BigDecimal的默认toString()方法使用科学计数法表示数字。在JSP页面上输出数字时,这将是一个问题。我不想用
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(BigDecimal.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
if(method.getName().equals("toString")){
return ((BigDecimal) obj).toPlainString();
}else{
System.out.println(method.getName() + " called.");
return proxy.invokeSuper(obj, args);
}
}
});
BigDecimal bd = (BigDecimal) enhancer.create(new Class[]{String.class}, new Object[]{"123"});
System.out.println(bd.toString());
我将看看Byte Buddy和Javassit,但猜测它们的工作方式与cglib类似。
有人知道实现此目标的方法吗?
对于JSP,我可能会放弃使用自定义的javax.el.BeanELResolver,但是仍然有一种方法可以覆盖整个应用程序中的标准库方法吗?
答案 0 :(得分:1)
您可以直接在类上扩展并覆盖您自己的类中的BigDecimal
方法,而不是直接使用toString
。然后,您只需要替换构造函数调用即可使用您的类。
public class MyBigDecimal extends BigDecimal {
public MyBigDecimal(String val) {
super(val);
}
@Override
public String toString() {
return toPlainString();
}
}