2021SC@SDUSC
FreeMarker代码分析第十篇
beans包
AllowAllMemberAccessPolicy.java
代码分析
package freemarker.ext.beans;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
允许各种数据通过
*/
final class AllowAllMemberAccessPolicy implements MemberAccessPolicy {
public static final AllowAllMemberAccessPolicy INSTANCE = new AllowAllMemberAccessPolicy();
private AllowAllMemberAccessPolicy() {
}
public static final ClassMemberAccessPolicy CLASS_POLICY_INSTANCE = new ClassMemberAccessPolicy() {
@Override
public boolean isMethodExposed(Method method) {
return true;
}
@Override
public boolean isConstructorExposed(Constructor<?> constructor) {
return true;
}
@Override
public boolean isFieldExposed(Field field) {
return true;
}
};
@Override
public ClassMemberAccessPolicy forClass(Class<?> contextClass) {
return CLASS_POLICY_INSTANCE;
}
@Override
public boolean isToStringAlwaysExposed() {
return true;
}
}
APIModel.java
代码分析
package freemarker.ext.beans;
/**
* 展示某个对象的 Java API (包括属性)
*
* <p>
* Notes:
* <ul>
* <li>封装情况继承于 {@link BeansWrapper}</li>
* <li>但是方法总会把属性封装起来,而不理会{@link BeansWrapper}中的情况</li>
* </ul>
*
* @since 2.3.22
*/
final class APIModel extends BeanModel {
APIModel(Object object, BeansWrapper wrapper) {
super(object, wrapper, false);
}
protected boolean isMethodsShadowItems() {
return true;
}
}
ArrayModel.java
代码分析
package freemarker.ext.beans;
import java.lang.reflect.Array;
import freemarker.ext.util.ModelFactory;
import freemarker.template.ObjectWrapper;
import freemarker.template.TemplateCollectionModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateSequenceModel;
/**
* <p>把任意array对象封装为 {@link TemplateCollectionModel}的类
* 允许其内属性通过array[i]的形式访问,同时可以使用list的方法操作
*/
public class ArrayModel
extends
BeanModel
implements
TemplateCollectionModel,
TemplateSequenceModel {
static final ModelFactory FACTORY =
new ModelFactory()
{
@Override
public TemplateModel create(Object object, ObjectWrapper wrapper) {
return new ArrayModel(object, (BeansWrapper) wrapper);
}
};
// array对象的数量
private final int length;
/**
* 创造一个能够容纳特殊数组对象的模型
* @param array 存放模型的array对象
* @param wrapper 与模型相关的{@link BeansWrapper} 对象
* 每个模型都有一个与 {@link BeansWrapper} 有关的实例.
* 这个模型从其包装类那获取很多属性,包括缓存表现,方法封装情况等等
* 如果不是Java的array对象会抛出如下异常@throws IllegalArgumentException
*/
public ArrayModel(Object array, BeansWrapper wrapper) {
super(array, wrapper);
Class clazz = array.getClass();
if (!clazz.isArray())
throw new IllegalArgumentException("Object is not an array, it's " + array.getClass().getName());
length = Array.getLength(array);
}
@Override
public TemplateModelIterator iterator() {
return new Iterator();
}
@Override
public TemplateModel get(int index)
throws TemplateModelException {
try {
return wrap(Array.get(object, index));
} catch (IndexOutOfBoundsException e) {
return null;
// throw new TemplateModelException("Index out of bounds: " + index);
}
}
/*
迭代器
*/
private class Iterator
implements
TemplateSequenceModel,
TemplateModelIterator {
private int position = 0;
@Override
public boolean hasNext() {
return position < length;
}
@Override
public TemplateModel get(int index)
throws TemplateModelException {
return ArrayModel.this.get(index);
}
@Override
public TemplateModel next()
throws TemplateModelException {
return position < length ? get(position++) : null;
}
@Override
public int size() {
return ArrayModel.this.size();
}
}
@Override
public int size() {
return length;
}
@Override
public boolean isEmpty() {
return length == 0;
}
}