java中自定义了一个SiteTag,用来做站点引用
Type Hierarchy 英 [ˈhaɪərɑ:ki] 类层次图如下
自顶向下进行分析
类 TagSupport 标签支持类,自定义Tag需要继承它实现
在javax.servlet.jsp.tagext下
public class TagSupport implements IterationTag, Serializable
outline图
从图中,方法名称带空心三角的,就是@Override方法
这个从其implement中实现的接口方法
里边就一个parent、values、id、pageContext几个变量,不是很多属性
1. 首先,看下其继承的第一个接口IterationTag
public interface IterationTag extends Tag
其中doAfterBody()、doStartTag()、doEndTag(),就是处理完”< … >”中的”…”后调用,开始处理“<”时调用,doEngTag则是“>”调用
2.分析TagSupport方法:
public static final Tag findAncestorWithClass(Tag from,
// TCK signature test fails with generics
@SuppressWarnings(“rawtypes”) Class klass)
这个方法是通过给一个类进行找它祖先的
方法体
boolean isInterface = false;
if (from == null ||
klass == null ||
(!Tag.class.isAssignableFrom(klass) &&
!(isInterface = klass.isInterface()))) {
return null;
}
for (;;) {
Tag tag = from.getParent();
if (tag == null) {
return null;
}
if ((isInterface && klass.isInstance(tag)) ||
((Class<?>)klass).isAssignableFrom(tag.getClass())) {
return tag;
}
from = tag;
}
前知识:isAssignableFrom ,
isAssignableFrom
示例:Class1.isAssignableFrom(Class2)
解释:① 判断Class1和Class2是否相同。②Class1是否是Class2的父类或者接口。
instance,a.isIntance(b),a是不是b的对象,b是父类,a是b的一个对象,包括上转对象等
首先第一个if循环
!Tag.class.isAssignableFrom(klass) – – klass不是直接extends或者implements Tag的
!(isInterface = klass.isInterface()) – – klass不是一个接口类型
总结起来就是
参数为空 || klass得是个类(Class) 且 klass不是直接extends或者implements Tag的或者同一对象
满足这样的条件,就是找不到
再次,无限循环里边的if
klass是个接口 且 klass是tag的实例 ||from的爸爸或者爷爷或者祖先是直接继承或者implements klass的或者相等
整个方法的意思就是,from是个Tag类型标签,klass是个界定条件
from — 》 klass(接口) — 》Tag 都是有type Hierarchy 层次关系,要找一个继承了kclass的from父类
查看Quick Type Hierarchy 可以看到非常多的类继承使用它了,整个项目的类层次图如下
今天的文章TagSupport 源码学习分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25955.html