FreeMarker代码分析(2)

2021SC@SDUSC

**内容非常主观,可能出现错漏,慎重参考

此部分是_DelayedConversionToString以及其子类,对各类string进行处理。

_DelayedConversionToString.java


package freemarker.core;

/** Don't use this; used internally by FreeMarker, might changes without notice. */
public abstract class _DelayedConversionToString {

    private static final String NOT_SET = new String();

    private Object object;
    private volatile String stringValue = NOT_SET;

    public _DelayedConversionToString(Object object) {
        this.object = object;
    }

    @Override
    public String toString() {
        String stringValue = this.stringValue;
        if (stringValue == NOT_SET) {
            synchronized (this) {
                stringValue = this.stringValue;
                if (stringValue == NOT_SET) {
                    stringValue = doConversion(object);
                    this.stringValue = stringValue; 
                    this.object = null;
                }
            }
        }
        return stringValue;
    }

    protected abstract String doConversion(Object obj);

}

_DelayedConversionToString重写了toString方法,当stringValue未设定值时,使全局变量stringValue = this.stringValue。

_DelayedAOrAn.java


package freemarker.core;

/** Don't use this; used internally by FreeMarker, might changes without notice. */
public class _DelayedAOrAn extends _DelayedConversionToString {

    public _DelayedAOrAn(Object object) {
        super(object);
    }

    @Override
    protected String doConversion(Object obj) {
        String s = obj.toString();
        return _MessageUtil.getAOrAn(s) + " " + s;
    }

}

_DelayedAOrAn是_DelayedConversionToString的子类

_DelayedFTLTypeDescription.java


package freemarker.core;

import freemarker.template.TemplateModel;
import freemarker.template.utility.ClassUtil;

/** Don't use this; used internally by FreeMarker, might changes without notice. */
public class _DelayedFTLTypeDescription extends _DelayedConversionToString {
    
    public _DelayedFTLTypeDescription(TemplateModel tm) {
        super(tm);
    }

    @Override
    protected String doConversion(Object obj) {
        return ClassUtil.getFTLTypeDescription((TemplateModel) obj);
    }

}

_DelayedFTLTypeDescription是_DelayedConversionToString的子类,对TemplateModel进行处理

_DelayedGetCanonicalForm.java


package freemarker.core;


/** Don't use this; used internally by FreeMarker, might changes without notice. */
public class _DelayedGetCanonicalForm extends _DelayedConversionToString {
    
    public _DelayedGetCanonicalForm(TemplateObject obj) {
        super(obj);
    }

    @Override
    protected String doConversion(Object obj) {
        try {
            return ((TemplateObject) obj).getCanonicalForm();
        } catch (Exception e) {
            return "{Error getting canonical form}";
        }
    }

}

_DelayedGetCanonicalForm是_DelayedConversionToString的子类,

DelayedGetMessage.java


package freemarker.core;

/** Don't use this; used internally by FreeMarker, might changes without notice. */
public class _DelayedGetMessage extends _DelayedConversionToString {

    public _DelayedGetMessage(Throwable exception) {
        super(exception);
    }

    @Override
    protected String doConversion(Object obj) {
        final String message = ((Throwable) obj).getMessage();
        return message == null || message.length() == 0 ? "[No exception message]" : message;
    }
    
}

_DelayedGetMessage是_DelayedConversionToString的子类,重写doConversion方法,重新给message赋值。

_DelayedGetMessageWithoutStackTop.java


package freemarker.core;

import freemarker.template.TemplateException;

/** Don't use this; used internally by FreeMarker, might changes without notice. */
public class _DelayedGetMessageWithoutStackTop extends _DelayedConversionToString {

    public _DelayedGetMessageWithoutStackTop(TemplateException exception) {
        super(exception);
    }

    @Override
    protected String doConversion(Object obj) {
        return ((TemplateException) obj).getMessageWithoutStackTop();
    }
    
}

_DelayedGetMessageWithoutStackTop方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值