tagsupport(TagSupport 源码学习)

发布时间:2025-12-10 19:24:17 浏览次数:5

TagSupport 源码学习-

TagSupport 源码学习java中自定义了一个SiteTag,用来做站点引用TypeHierarchy英[ˈhaɪərɑ:ki]类层次图如下自顶向下进行分析类TagSupport标签支持类,自定义Tag需要继承它实现在javax.servlet.jsp.tagext下publicclassTagSupportimplementsIterationTag,Seriali


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;        }

是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活CLion DataGrip DataSpell dotCover dotMemory dotTrace GoLand PhpStorm PyCharm ReSharper ReShaC++ Rider RubyMine WebStorm 全家桶 刷新

【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…

前知识: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 可以看到非常多的类继承使用它了,整个项目的类层次图如下













































需要做网站?需要网络推广?欢迎咨询客户经理 13272073477