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方法