如何重写BigDecimal toString()方法?

时间:2019-05-10 00:42:51

标签: java jsp bigdecimal cglib

我正在开发使用JSP构建的旧版Web应用程序。我被要求在代码中用BigDecimal替换double。我知道BigDecimal的默认toString()方法使用科学计数法表示数字。在JSP页面上输出数字时,这将是一个问题。我不想用替换每个$ {obj.property}。因此,我想知道是否有一种方法可以覆盖toString()方法,因此它将改为调用 toPlainString()吗?我尝试了cglib,但是意识到它不是出于此目的,因为它只能操作由Enhancer生成的BigDecimal,如下所示:

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,但是仍然有一种方法可以覆盖整个应用程序中的标准库方法吗?

1 个答案:

答案 0 :(得分:1)

您可以直接在类上扩展并覆盖您自己的类中的BigDecimal方法,而不是直接使用toString。然后,您只需要替换构造函数调用即可使用您的类。

public class MyBigDecimal extends BigDecimal {
    public MyBigDecimal(String val) {
        super(val);
    }

    @Override
    public String toString() {
        return toPlainString();
    }
}