2021SC@SDUSC
FreeMarker代码分析第十篇- beans包
- AllowAllMemberAccessPolicy.java
- 代码分析
- APIModel.java
- 代码分析
- ArrayModel.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;
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;
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;
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;
}
}



