TagSupport 源码学习


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













































  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值