TagSupport 源码学习

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

java中自定义了一个SiteTag,用来做站点引用

Type Hierarchy [ˈhaɪərɑ:ki] 类层次图如下

TagSupport 源码学习

自顶向下进行分析

类 TagSupport 标签支持类,自定义Tag需要继承它实现

在javax.servlet.jsp.tagext下

public class TagSupport implements IterationTag, Serializable

outline图

TagSupport 源码学习

从图中,方法名称带空心三角的,就是@Override方法

这个从其implement中实现的接口方法

里边就一个parent、values、id、pageContext几个变量,不是很多属性

1. 首先,看下其继承的第一个接口IterationTag

public interface IterationTag extends Tag
TagSupport 源码学习

TagSupport 源码学习

其中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 源码学习

今天的文章TagSupport 源码学习分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25955.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注