javax.lang.model.util源码解析

前言

本文我们来看一下javax.lang.model.util中的类,这是javax.lang.model中的最后一个子包了.这部分的代码不太好理解.

解析

Elements

操作java源程序元素的工具方法.

兼容性提醒:本类中的方法可能会在未来的版本中添加.

public interface Elements {

    /**
     * 返回指定全限定名所对应的PackageElement.如果指定的是"",则返回未命名包.如果没有找到对应的,则返回null.
     *
     */
    PackageElement getPackageElement(CharSequence name);

    /**
     * 返回指定规范名称对应的TypeElement,如果没有对应的,则返回null.
     *
     */
    TypeElement getTypeElement(CharSequence name);

    /**
     * 返回该注解的元素所对应的值,包括默认值
     */
    Map<? extends ExecutableElement, ? extends AnnotationValue>
            getElementValuesWithDefaults(AnnotationMirror a);

    /**
     * 返回该元素所对应的Javadoc.
     * 该元素对应的文档注释是有/**开头的,以*/结尾的,忽略空格。因此,文档注释包含至少三
     * 个“*”字符。文档注释返回的文本是在源代码中出现的注释的处理形式.开头的“/**”和结尾
     * 的“*/”被删除.对于在初始“/**”之后开始的注释行,前导空白字符将被丢弃,而在空白之后
     * 或开始该行时出现的任何连续的“*”字符也被丢弃。然后将处理后的行连接在一起(包括行终止符)并返回。
     */
    String getDocComment(Element e);

    /**
     * 如果指定的元素是deprecated,则返回true,否则,返回false.
     */
    boolean isDeprecated(Element e);

    /**
     * 返回指定元素所对应的二进制名称.
     * 关于这部分内容,可以参阅 JLS 13.1 二进制形式
     */
    Name getBinaryName(TypeElement type);


    /**
     * 返回指定元素所对应的包,如果指定的元素是包,则返回自己
     */
    PackageElement getPackageOf(Element type);

    /**
     * 返回指定元素的内部成员,包括继承和直接声明的.
     * 对于一个类来说,包含构造器,但是不包含本地或者匿名类
     * 请注意,某些类型的元素可以使用ElementFilter中的方法进行过滤。
     */
    List<? extends Element> getAllMembers(TypeElement type);

    /**
     * 返回该元素所对应的所有注解,不管是直接声明的还是继承的
     */
    List<? extends AnnotationMirror> getAllAnnotationMirrors(Element e);

    /**
     * 如果第一个Element隐藏了第二个Element,则返回true
     */
    boolean hides(Element hider, Element hidden);

    /**
     * 测试第一个方法,作为制定类型的成员,复写了第二个方法
     * 当一个非抽象的方法复写了抽象的方法,这也叫实现.
     * 在最简单和最典型的用法中,类型参数的值只是含有复写方法的类或接口。举例:m1代表的是
     * String.hashCode,m2代表的是Object.hashCode.我们可以通过如下方式来测试是否String
     * 中的m1的方法复写了m2:
     * assert elements.overrides(m1, m2,
     *          elements.getTypeElement("java.lang.String")); 
     *  以下示例可说明更有趣的情况,其中类型A中的方法不重写类型B中的同名方法:
     *    class A { public void m() {} } }
            interface B { void m(); } }
            ...
            m1 = ...; // A.m 
            m2 = ...; // B.m 
            assert ! elements.overrides(m1, m2, elements.getTypeElement("A"));
      *  当有第三个类型c时,A中的方法就复写了B中的方法:       
      *  assert elements.overrides(m1, m2,
     *          elements.getTypeElement("C")); 
     */
    boolean overrides(ExecutableElement overrider, ExecutableElement overridden,
                      TypeElement type);

    /**
     * 返回表示原始类型值或字符串的常量表达式的文本。返回的文本格式适合于表示源代码中的值。
     * 参数value是 原始类型的值或者是String
     */
    String getConstantExpression(Object value);

    /**
     * 按指定的顺序将元素的表示打印到给定的Writer。这种方法的主要目的是用于诊断。未指定输出的确切格式,并有可能更改这种输出格式。
     */
    void printElements(java.io.Writer w, Element... elements);

    /**
     * 返回指定参数所对应的Name
     */
    Name getName(CharSequence cs);

    /**
     * 如果给定的类是函数接口,则返回true
     */
    boolean isFunctionalInterface(TypeElement type);
}

Types

操作类型的工具方法的接口

public interface Types {

    /**
     * 返回与类型对应的元素。类型可以是声明类型或类型变量。如果类型不是具有相应元素的类型,则返回null
     */
    Element asElement(TypeMirror t);

    /**
     * 测试是否2个对象代表的是同一个类型.
     * 警告:如果此方法的任何一个参数表示通配符,则此方法将返回false。因此,通配符不是与自
     * 身相同的类型。这可能首先令人惊讶,但一旦你认为这样的例子必须被编译器拒绝,才有意义:
     *    List<?> list = new ArrayList<Object>();
     *  list.add(list.get(0));
     *  由于注释仅是与类型相关联的元数据,所以在计算两个TypeMirror对象是否为相同类型时,
     *  不考虑两个参数上的注释集。特别地,两个类型的反射对象可以具有不同的注释,并且仍然被
     *  认为是相同的
     */
    boolean isSameType(TypeMirror t1, TypeMirror t2);

    /**
     * 测试是否第一个TypeMirror是第二个TypeMirror的子类型.任何类型都被认为是它自身的子类型
     */
    boolean isSubtype(TypeMirror t1, TypeMirror t2);

    /**
     * 测试一种类型是否可分配给另一种类型。 
     * 这部分的内容可以参考 JLS 5.2 Assignment Conversion
     */
    boolean isAssignable(TypeMirror t1, TypeMirror t2);

    /**
     * 如果第一个参数包含第二个参数则返回true
     */
    boolean contains(TypeMirror t1, TypeMirror t2);

    /**
     * 测试是否第一个参数是第二个参数的子签名
     */
    boolean isSubsignature(ExecutableType m1, ExecutableType m2);

    /**
     * 返回类型的直接超类型。接口类型(如果有的话)将出现在列表中的最后一个。
     */
    List<? extends TypeMirror> directSupertypes(TypeMirror t);

    /**
     * 返回指定类型擦除后的TypeMirror.  
     */
    TypeMirror erasure(TypeMirror t);

    /**
     * 返回指定类型的包装类型
     */
    TypeElement boxedClass(PrimitiveType p);

    /**
     * 返回指定包装类型所对应的原始类型
     */
    PrimitiveType unboxedType(TypeMirror t);

    /**
     * 对指定类型进行捕获转换
     */
    TypeMirror capture(TypeMirror t);

    /**
     * 返回指定TypeKind所对应的PrimitiveType
     */
    PrimitiveType getPrimitiveType(TypeKind kind);

    /**
     * 返回NullType-->代表null的类型
     */
    NullType getNullType();

    /**
     * 返回没有实际类型时使用的伪类型。返回的类型可以是TypeKind#VOID,也可以是TypeKind#NONE。对于包,使用 Elements.getPackageElement(CharSequence).asType()。
     */
    NoType getNoType(TypeKind kind);

    /**
     * 返回具有指定组件类型的数组类型.
     */
    ArrayType getArrayType(TypeMirror componentType);

    /**
     * 返回一个新的通配符类型参数。通配符的边界可以指定,或者两者都不,但不是两者都有。
     */
    WildcardType getWildcardType(TypeMirror extendsBound,
                                 TypeMirror superBound);

    /**
     * 返回与类型元素和实际类型参数相对应的类型。例如,给定Set的类型元素和String的TypeMirror
     * ,此方法可用于获得参数化类型Set<String>。
     * 类型参数的数目必须等于TypeElement的形式类型参数的数目,或者必须为零。如果为零,如
     * 果类型元素是泛型,则返回类型元素的原始类型
     * 如果正在返回参数化类型,则其类型元素不能包含在泛型外部类中。例如,参数化类型
     * Outer<String>.Inner<Number>,可以通过首先使用此方法获得类型Outer<String>,然
     * 后调用getDeclaredType(DeclaredType、TypeElement、TypeMirror)来构造。
     * 
     */
    DeclaredType getDeclaredType(TypeElement typeElem, TypeMirror... typeArgs);

    /**
     * 返回与类型元素和实际类型参数相对应的类型,给定包含成员类型的成员类型。例如,可以通过
     * 首先使用getDeclaredType(TypeElement,TypeMirror)获得类型Outer<String>,然
     * 后调用此方法来构造参数化类型Outer<String>.Inner<Number>。
     * 如果包含的类型是参数化类型,则类型参数的数量必须等于typeElem的形式类型参数的数量。
     * 如果它不是参数化的,或者它是空的,那么这个方法就等同于getDeclaredType(typeElem, typeArgs)
     */
    DeclaredType getDeclaredType(DeclaredType containing,
                                 TypeElement typeElem, TypeMirror... typeArgs);

    /**
     * 当元素被视为给定类型的成员或直接包含时,返回元素的类型。
     * 当第一个参数是Set<String>,第二个参数是Set.add方法时,则返回一个参数为String的ExecutableType
     */
    TypeMirror asMemberOf(DeclaredType containing, Element element);
}

接下来我们来看一下AbstractTypeVisitor6的继承结构中涉及到的类或接口,如图:

1

AbstractTypeVisitor6

具有默认行为的类型的访问者,适用于jdk 1.6.

警告:该类实现的Type EvestIdor接口可能会在将来添加一些方法,以适应添加到Java编程语言未来版本的新的、目前未知的语言结构。因此,名称以“visit”开头的方法将来可能会被添加到这个类中;为了避免不兼容,扩展这个类的类不应声明任何以“visit”开头的实例方法。

当添加了这种新的访问方法时,此类中的默认实现将调用visitUnknown方法。还将引入一个新的抽象类型访问者类来对应新版本的语言;该访问者中的访问方法具有不同的默认行为。当新访问者被引入时,该类中的一部分或者全部都将被废弃.

注意,在访问者界面中添加一个新的访问方法的默认实现,而不是直接在访问者界面中添加一个默认方法,因为Java SE 8语言特征不能用于这个版本的API,因为这个版本需要在Java SE 7上运行。仅在Java SE 8和以后运行的API的未来版本可能会在这种情况下利用默认方法。

泛型参数 R –> 该visit方法的返回值类型
泛型参数 P –> visit方法额外添加的参数

public abstract class AbstractTypeVisitor6<R, P> implements TypeVisitor<R, P> {

    protected AbstractTypeVisitor6() {}


    public final R visit(TypeMirror t, P p) {
        return t.accept(this, p);
    }


    public final R visit(TypeMirror t) {
        return t.accept(this, null);
    }


    public R visitUnion(UnionType t, P p) {
        return visitUnknown(t, p);
    }


    public R visitIntersection(IntersectionType t, P p) {
        return visitUnknown(t, p);
    }


    public R visitUnknown(TypeMirror t, P p) {
        throw new UnknownTypeException(t, p);
    }
}

AbstractTypeVisitor7

用于jdk1.7的type visitor。

public abstract class AbstractTypeVisitor7<R, P> extends AbstractTypeVisitor6<R, P> {

    protected AbstractTypeVisitor7() {
        super();
    }

    public abstract R visitUnion(UnionType t, P p);
}

AbstractTypeVisitor8

用于jdk1.8的type visitor。

public abstract class AbstractTypeVisitor8<R, P> extends AbstractTypeVisitor7<R, P> {
   protected AbstractTypeVisitor8() {
        super();
    }

   public abstract R visitIntersection(IntersectionType t, P p);
}

SimpleElementVisitor6

对应jdk1.6的简单的visitor.

当visit方法是与jdk1.6的语法结构相关的,则会调用defaultAction方法.对应在jdk1.7或者之后的语法结构,则调用visitUnknown方法.

@SupportedSourceVersion(RELEASE_6)
public class SimpleElementVisitor6<R, P> extends AbstractElementVisitor6<R, P> {
    /**
     * defaultAction 方法默认的返回值
     */
    protected final R DEFAULT_VALUE;


    protected SimpleElementVisitor6(){
        DEFAULT_VALUE = null;
    }


    protected SimpleElementVisitor6(R defaultValue){
        DEFAULT_VALUE = defaultValue;
    }

    protected R defaultAction(Element e, P p) {
        return DEFAULT_VALUE;
    }


    public R visitPackage(PackageElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitType(TypeElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitVariable(VariableElement e, P p) {
        // 如果VariableElement的种类不是RESOURCE_VARIABLE,则调用defaultAction方法,
        // ElementKind.RESOURCE_VARIABLE 对应jdk1.7的资源变量
        if (e.getKind() != ElementKind.RESOURCE_VARIABLE)
            return defaultAction(e, p);
        else
            return visitUnknown(e, p);
    }


    public R visitExecutable(ExecutableElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitTypeParameter(TypeParameterElement e, P p) {
        return defaultAction(e, p);
    }
}

SimpleElementVisitor7

对应jdk1.7的简单的visitor.

当visit方法是与jdk1.7和之前版本的语法结构相关的,则会调用defaultAction方法.

@SupportedSourceVersion(RELEASE_7)
public class SimpleElementVisitor7<R, P> extends SimpleElementVisitor6<R, P> {

    protected SimpleElementVisitor7(){
        super(null);
    }


    protected SimpleElementVisitor7(R defaultValue){
        super(defaultValue);
    }


    // 可以看到在SimpleElementVisitor6还需判断是否是jdk1.7中的ElementKind.RESOURCE_VARIABLE,在这里就直接调用defaultAction了.
    @Override
    public R visitVariable(VariableElement e, P p) {
        return defaultAction(e, p);
    }
}

SimpleElementVisitor8

对应jdk1.7的简单的visitor.

当visit方法是与jdk1.7和之前版本的语法结构相关的,则会调用defaultAction方法.

@SupportedSourceVersion(RELEASE_8)
public class SimpleElementVisitor8<R, P> extends SimpleElementVisitor7<R, P> {

    protected SimpleElementVisitor8(){
        super(null);
    }


    protected SimpleElementVisitor8(R defaultValue){
        super(defaultValue);
    }
}

TypeKindVisitor6

一个类型的Visitor,其默认行为适用于jdk1.6。对于可能具有多种类型的XYZ类型,该类中的visitXYZ方法委托给与第一个参数的类型相对应的visitXYZKind方法。visitXYZKind方法调用defaultAction方法,将它们的参数传递给defaultAction的相应参数。

@SupportedSourceVersion(RELEASE_6)
public class TypeKindVisitor6<R, P> extends SimpleTypeVisitor6<R, P> {

    protected TypeKindVisitor6() {
        super(null);
    }


    protected TypeKindVisitor6(R defaultValue) {
        super(defaultValue);
    }

    @Override
    public R visitPrimitive(PrimitiveType t, P p) {
        TypeKind k = t.getKind();
        switch (k) {
        case BOOLEAN:
            return visitPrimitiveAsBoolean(t, p);

        case BYTE:
            return visitPrimitiveAsByte(t, p);

        case SHORT:
            return visitPrimitiveAsShort(t, p);

        case INT:
            return visitPrimitiveAsInt(t, p);

        case LONG:
            return visitPrimitiveAsLong(t, p);

        case CHAR:
            return visitPrimitiveAsChar(t, p);

        case FLOAT:
            return visitPrimitiveAsFloat(t, p);

        case DOUBLE:
            return visitPrimitiveAsDouble(t, p);

        default:
            throw new AssertionError("Bad kind " + k + " for PrimitiveType" + t);
        }
    }

    public R visitPrimitiveAsBoolean(PrimitiveType t, P p) {
        return defaultAction(t, p);
    }


    public R visitPrimitiveAsByte(PrimitiveType t, P p) {
        return defaultAction(t, p);
    }


    public R visitPrimitiveAsShort(PrimitiveType t, P p) {
        return defaultAction(t, p);
    }


    public R visitPrimitiveAsInt(PrimitiveType t, P p) {
        return defaultAction(t, p);
    }


    public R visitPrimitiveAsLong(PrimitiveType t, P p) {
        return defaultAction(t, p);
    }


    public R visitPrimitiveAsChar(PrimitiveType t, P p) {
        return defaultAction(t, p);
    }


    public R visitPrimitiveAsFloat(PrimitiveType t, P p) {
        return defaultAction(t, p);
    }


    public R visitPrimitiveAsDouble(PrimitiveType t, P p) {
        return defaultAction(t, p);
    }


    @Override
    public R visitNoType(NoType t, P p) {
        TypeKind k = t.getKind();
        switch (k) {
        case VOID:
            return visitNoTypeAsVoid(t, p);

        case PACKAGE:
            return visitNoTypeAsPackage(t, p);

        case NONE:
            return visitNoTypeAsNone(t, p);

        default:
            throw new AssertionError("Bad kind " + k + " for NoType" + t);
        }
    }


    public R visitNoTypeAsVoid(NoType t, P p) {
        return defaultAction(t, p);
    }


    public R visitNoTypeAsPackage(NoType t, P p) {
        return defaultAction(t, p);
    }


    public R visitNoTypeAsNone(NoType t, P p) {
        return defaultAction(t, p);
    }
}

TypeKindVisitor7

适用于jdk1.7的visitor.

@SupportedSourceVersion(RELEASE_7)
public class TypeKindVisitor7<R, P> extends TypeKindVisitor6<R, P> {


    protected TypeKindVisitor7() {
        super(null);
    }


    protected TypeKindVisitor7(R defaultValue) {
        super(defaultValue);
    }


    @Override
    public R visitUnion(UnionType t, P p) {
        return defaultAction(t, p);
    }
}

TypeKindVisitor8

适用于jdk1.8的visitor.

@SupportedSourceVersion(RELEASE_8)
public class TypeKindVisitor8<R, P> extends TypeKindVisitor7<R, P> {

    protected TypeKindVisitor8() {
        super(null);
    }


    protected TypeKindVisitor8(R defaultValue) {
        super(defaultValue);
    }


    @Override
    public R visitIntersection(IntersectionType t, P p) {
        return defaultAction(t, p);
    }
}

接下来看一下AbstractElementVisitor6的继承结构,如图

2

AbstractElementVisitor6

适用于jdk 1.6的Element Visitor.

@SupportedSourceVersion(RELEASE_6)
public abstract class AbstractElementVisitor6<R, P> implements ElementVisitor<R, P> {

    protected AbstractElementVisitor6(){}


    public final R visit(Element e, P p) {
        return e.accept(this, p);
    }


    public final R visit(Element e) {
        return e.accept(this, null);
    }


    public R visitUnknown(Element e, P p) {
        throw new UnknownElementException(e, p);
    }
}

AbstractElementVisitor7

适用于jdk 1.7的Element Visitor.

@SupportedSourceVersion(RELEASE_7)
public abstract class AbstractElementVisitor7<R, P> extends AbstractElementVisitor6<R, P> {
   protected AbstractElementVisitor7(){
        super();
    }
}

AbstractElementVisitor8

适用于jdk 1.8的Element Visitor.

@SupportedSourceVersion(RELEASE_8)
public abstract class AbstractElementVisitor8<R, P> extends AbstractElementVisitor7<R, P> {

    protected AbstractElementVisitor8(){
        super();
    }
}

ElementScanner6

一个具有默认行为的程序元素的Scanner,适用于jdk1.6。这个类中的visitXYZ方法通过调用对它们所包围的元素、参数等对应的scan方法来扫描它们的组件元素.子类可以通过覆盖visitXYZ方法来控制访问的顺序元素。注意,Scanner的客户端可以获得所期望的行为,即调用感兴趣的根对象上的v.scan(e, p)而不是v.visit(e, p).

当子类重写visitXYZ方法时,新方法通过调用super.visitXYZ来扫描其所包围的元素,具体访问者可以控制关于附加处理的组件元素遍历的顺序;例如,在重写方法开始时始终调用super.visitXYZ将产生先序遍历,等等。如果选用按照其他顺序进行遍历,则按照需要的顺序调用对应的visit方法,而不是适用
super.visitXYZ.

@SupportedSourceVersion(RELEASE_6)
public class ElementScanner6<R, P> extends AbstractElementVisitor6<R, P> {

    protected final R DEFAULT_VALUE;


    protected ElementScanner6(){
        DEFAULT_VALUE = null;
    }


    protected ElementScanner6(R defaultValue){
        DEFAULT_VALUE = defaultValue;
    }


    public final R scan(Iterable<? extends Element> iterable, P p) {
        R result = DEFAULT_VALUE;
        for(Element e : iterable)
            result = scan(e, p);
        return result;
    }


    public R scan(Element e, P p) {
        return e.accept(this, p);
    }


    public final R scan(Element e) {
        return scan(e, null);
    }


    public R visitPackage(PackageElement e, P p) {
        return scan(e.getEnclosedElements(), p);
    }


    public R visitType(TypeElement e, P p) {
        return scan(e.getEnclosedElements(), p);
    }


    public R visitVariable(VariableElement e, P p) {
        if (e.getKind() != ElementKind.RESOURCE_VARIABLE)
            return scan(e.getEnclosedElements(), p);
        else
            return visitUnknown(e, p);
    }


    public R visitExecutable(ExecutableElement e, P p) {
        return scan(e.getParameters(), p);
    }


    public R visitTypeParameter(TypeParameterElement e, P p) {
        return scan(e.getEnclosedElements(), p);
    }
}

ElementScanner7

适用于jdk1.7的 ElementScanner.

@SupportedSourceVersion(RELEASE_7)
public class ElementScanner7<R, P> extends ElementScanner6<R, P> {

    protected ElementScanner7(){
        super(null);
    }


    protected ElementScanner7(R defaultValue){
        super(defaultValue);
    }


    @Override
    public R visitVariable(VariableElement e, P p) {
        return scan(e.getEnclosedElements(), p);
    }
}

ElementScanner8

适用于jdk1.8的 ElementScanner.

@SupportedSourceVersion(RELEASE_8)
public class ElementScanner8<R, P> extends ElementScanner7<R, P> {

    protected ElementScanner8(){
        super(null);
    }


    protected ElementScanner8(R defaultValue){
        super(defaultValue);
    }
}

ElementKindVisitor6

程序元素类型的 visitor,适用于jdk1.6.

@SupportedSourceVersion(RELEASE_6)
public class ElementKindVisitor6<R, P>
                  extends SimpleElementVisitor6<R, P> {

    protected ElementKindVisitor6() {
        super(null);
    }


    protected ElementKindVisitor6(R defaultValue) {
        super(defaultValue);
    }


    @Override
    public R visitPackage(PackageElement e, P p) {
        assert e.getKind() == PACKAGE: "Bad kind on PackageElement";
        return defaultAction(e, p);
    }


    @Override
    public R visitType(TypeElement e, P p) {
        ElementKind k = e.getKind();
        switch(k) {
        case ANNOTATION_TYPE:
            return visitTypeAsAnnotationType(e, p);

        case CLASS:
            return visitTypeAsClass(e, p);

        case ENUM:
            return visitTypeAsEnum(e, p);

        case INTERFACE:
            return visitTypeAsInterface(e, p);

        default:
            throw new AssertionError("Bad kind " + k + " for TypeElement" + e);
        }
    }


    public R visitTypeAsAnnotationType(TypeElement e, P p) {
        return defaultAction(e, p);
    }

    public R visitTypeAsClass(TypeElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitTypeAsEnum(TypeElement e, P p) {
        return defaultAction(e, p);
    }

    public R visitTypeAsInterface(TypeElement e, P p) {
        return defaultAction(e, p);
    }

    /**

    @Override
    public R visitVariable(VariableElement e, P p) {
        ElementKind k = e.getKind();
        switch(k) {
        case ENUM_CONSTANT:
            return visitVariableAsEnumConstant(e, p);

        case EXCEPTION_PARAMETER:
            return visitVariableAsExceptionParameter(e, p);

        case FIELD:
            return visitVariableAsField(e, p);

        case LOCAL_VARIABLE:
            return visitVariableAsLocalVariable(e, p);

        case PARAMETER:
            return visitVariableAsParameter(e, p);

        case RESOURCE_VARIABLE:
            return visitVariableAsResourceVariable(e, p);

        default:
            throw new AssertionError("Bad kind " + k + " for VariableElement" + e);
        }
    }


    public R visitVariableAsEnumConstant(VariableElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitVariableAsExceptionParameter(VariableElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitVariableAsField(VariableElement e, P p) {
        return defaultAction(e, p);
    }

    public R visitVariableAsLocalVariable(VariableElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitVariableAsParameter(VariableElement e, P p) {
        return defaultAction(e, p);
    }

        public R visitVariableAsResourceVariable(VariableElement e, P p) {
        return visitUnknown(e, p);
    }

        @Override
    public R visitExecutable(ExecutableElement e, P p) {
        ElementKind k = e.getKind();
        switch(k) {
        case CONSTRUCTOR:
            return visitExecutableAsConstructor(e, p);

        case INSTANCE_INIT:
            return visitExecutableAsInstanceInit(e, p);

        case METHOD:
            return visitExecutableAsMethod(e, p);

        case STATIC_INIT:
            return visitExecutableAsStaticInit(e, p);

        default:
            throw new AssertionError("Bad kind " + k + " for ExecutableElement" + e);
        }
    }


    public R visitExecutableAsConstructor(ExecutableElement e, P p) {
        return defaultAction(e, p);
    }

    public R visitExecutableAsInstanceInit(ExecutableElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitExecutableAsMethod(ExecutableElement e, P p) {
        return defaultAction(e, p);
    }


    public R visitExecutableAsStaticInit(ExecutableElement e, P p) {
        return defaultAction(e, p);
    }



    @Override
    public R visitTypeParameter(TypeParameterElement e, P p) {
        assert e.getKind() == TYPE_PARAMETER: "Bad kind on TypeParameterElement";
        return defaultAction(e, p);
    }
}

ElementKindVisitor7

程序元素类型的 visitor,适用于jdk1.7.

@SupportedSourceVersion(RELEASE_7)
public class ElementKindVisitor7<R, P> extends ElementKindVisitor6<R, P> {

    protected ElementKindVisitor7() {
        super(null);
    }


    protected ElementKindVisitor7(R defaultValue) {
        super(defaultValue);
    }


    @Override
    public R visitVariableAsResourceVariable(VariableElement e, P p) {
        return defaultAction(e, p);
    }
}

ElementKindVisitor8

程序元素类型的 visitor,适用于jdk1.8.

@SupportedSourceVersion(RELEASE_8)
public class ElementKindVisitor8<R, P> extends ElementKindVisitor7<R, P> {

    protected ElementKindVisitor8() {
        super(null);
    }


    protected ElementKindVisitor8(R defaultValue) {
        super(defaultValue);
    }
}

接下来我们来看下AbstractAnnotationValueVisitor6的继承结构,如图:

3

AbstractAnnotationValueVisitor6

注解值的visitor,用于jdk 1.6

@SupportedSourceVersion(RELEASE_6)
public abstract class AbstractAnnotationValueVisitor6<R, P>
    implements AnnotationValueVisitor<R, P> {


    protected AbstractAnnotationValueVisitor6() {}

    public final R visit(AnnotationValue av, P p) {
        return av.accept(this, p);
    }


    public final R visit(AnnotationValue av) {
        return av.accept(this, null);
    }

    public R visitUnknown(AnnotationValue av, P p) {
        throw new UnknownAnnotationValueException(av, p);
    }
}

AbstractAnnotationValueVisitor7

注解值的visitor,用于jdk 1.7

@SupportedSourceVersion(RELEASE_7)
public abstract class AbstractAnnotationValueVisitor7<R, P> extends AbstractAnnotationValueVisitor6<R, P> {


    protected AbstractAnnotationValueVisitor7() {
        super();
    }
}

AbstractAnnotationValueVisitor8

注解值的visitor,用于jdk 1.8

@SupportedSourceVersion(RELEASE_8)
public abstract class AbstractAnnotationValueVisitor8<R, P> extends AbstractAnnotationValueVisitor7<R, P> {

    /**
     * Constructor for concrete subclasses to call.
     */
    protected AbstractAnnotationValueVisitor8() {
        super();
    }
}

SimpleAnnotationValueVisitor6

针对jdk 1.6的注解值的visitor。所有的visit方法都会调用defaultAction方法.

@SupportedSourceVersion(RELEASE_6)
public class SimpleAnnotationValueVisitor6<R, P>
    extends AbstractAnnotationValueVisitor6<R, P> {

    protected final R DEFAULT_VALUE;


    protected SimpleAnnotationValueVisitor6() {
        super();
        DEFAULT_VALUE = null;
    }


    protected SimpleAnnotationValueVisitor6(R defaultValue) {
        super();
        DEFAULT_VALUE = defaultValue;
    }


    protected R defaultAction(Object o, P p) {
        return DEFAULT_VALUE;
    }


    public R visitBoolean(boolean b, P p) {
        return defaultAction(b, p);
    }


    public R visitByte(byte b, P p) {
        return defaultAction(b, p);
    }


    public R visitChar(char c, P p) {
        return defaultAction(c, p);
    }

        public R visitDouble(double d, P p) {
        return defaultAction(d, p);
    }


    public R visitFloat(float f, P p) {
        return defaultAction(f, p);
    }


    public R visitInt(int i, P p) {
        return defaultAction(i, p);
    }

        public R visitLong(long i, P p) {
        return defaultAction(i, p);
    }


    public R visitShort(short s, P p) {
        return defaultAction(s, p);
    }

       public R visitString(String s, P p) {
        return defaultAction(s, p);
    }


    public R visitType(TypeMirror t, P p) {
        return defaultAction(t, p);
    }


    public R visitEnumConstant(VariableElement c, P p) {
        return defaultAction(c, p);
    }


    public R visitAnnotation(AnnotationMirror a, P p) {
        return defaultAction(a, p);
    }

    public R visitArray(List<? extends AnnotationValue> vals, P p) {
        return defaultAction(vals, p);
    }
}

SimpleAnnotationValueVisitor7

针对jdk 1.7的注解值的visitor。所有的visit方法都会调用defaultAction方法.

@SupportedSourceVersion(RELEASE_7)
public class SimpleAnnotationValueVisitor7<R, P> extends SimpleAnnotationValueVisitor6<R, P> {

    protected SimpleAnnotationValueVisitor7() {
        super(null);
    }


    protected SimpleAnnotationValueVisitor7(R defaultValue) {
        super(defaultValue);
    }
}

SimpleAnnotationValueVisitor8

针对jdk 1.8的注解值的visitor。

@SupportedSourceVersion(RELEASE_8)
public class SimpleAnnotationValueVisitor8<R, P> extends SimpleAnnotationValueVisitor7<R, P> {

    protected SimpleAnnotationValueVisitor8() {
        super(null);
    }


    protected SimpleAnnotationValueVisitor8(R defaultValue) {
        super(defaultValue);
    }
}

ElementFilter

过滤器,用于从元素集合中选择感兴趣元素。返回的集合和列表是新集合,并使用该参数作为后备存储。该类中的方法不保证防止参数的并发修改。返回的集合和列表是可变的,但对于并发访问来说是不安全的。返回集具有与方法的参数相同的迭代顺序。

如果将包含NULL的迭代项和集合作为参数传递给该类中的方法,则将引发NullPointerException异常。

注意,静态导入语句可以使对该类中的方法的调用文本更加简洁;举例:

import static javax.lang.model.util.ElementFilter.*;
     ...
List<VariableElement> fs = fieldsIn(someClass.getEnclosedElements());

代码如下:

public class ElementFilter {
    private ElementFilter() {} // Do not instantiate.

    private static final Set<ElementKind> CONSTRUCTOR_KIND =
        Collections.unmodifiableSet(EnumSet.of(ElementKind.CONSTRUCTOR));

    private static final Set<ElementKind> FIELD_KINDS =
        Collections.unmodifiableSet(EnumSet.of(ElementKind.FIELD,
                                               ElementKind.ENUM_CONSTANT));
    private static final Set<ElementKind> METHOD_KIND =
        Collections.unmodifiableSet(EnumSet.of(ElementKind.METHOD));

    private static final Set<ElementKind> PACKAGE_KIND =
        Collections.unmodifiableSet(EnumSet.of(ElementKind.PACKAGE));

    private static final Set<ElementKind> TYPE_KINDS =
        Collections.unmodifiableSet(EnumSet.of(ElementKind.CLASS,
                                               ElementKind.ENUM,
                                               ElementKind.INTERFACE,
                                               ElementKind.ANNOTATION_TYPE));

    public static List<VariableElement>
            fieldsIn(Iterable<? extends Element> elements) {
        return listFilter(elements, FIELD_KINDS, VariableElement.class);
    }


    public static Set<VariableElement>
            fieldsIn(Set<? extends Element> elements) {
        return setFilter(elements, FIELD_KINDS, VariableElement.class);
    }


    public static List<ExecutableElement>
            constructorsIn(Iterable<? extends Element> elements) {
        return listFilter(elements, CONSTRUCTOR_KIND, ExecutableElement.class);
    }


    public static Set<ExecutableElement>
            constructorsIn(Set<? extends Element> elements) {
        return setFilter(elements, CONSTRUCTOR_KIND, ExecutableElement.class);
    }


    public static List<ExecutableElement>
            methodsIn(Iterable<? extends Element> elements) {
        return listFilter(elements, METHOD_KIND, ExecutableElement.class);
    }


    public static Set<ExecutableElement>
            methodsIn(Set<? extends Element> elements) {
        return setFilter(elements, METHOD_KIND, ExecutableElement.class);
    }


    public static List<TypeElement>
            typesIn(Iterable<? extends Element> elements) {
        return listFilter(elements, TYPE_KINDS, TypeElement.class);
    }

    /**

    public static Set<TypeElement>
            typesIn(Set<? extends Element> elements) {
        return setFilter(elements, TYPE_KINDS, TypeElement.class);
    }

   public static List<PackageElement>
            packagesIn(Iterable<? extends Element> elements) {
        return listFilter(elements, PACKAGE_KIND, PackageElement.class);
    }


    public static Set<PackageElement>
            packagesIn(Set<? extends Element> elements) {
        return setFilter(elements, PACKAGE_KIND, PackageElement.class);
    }

    // Assumes targetKinds and E are sensible.
    private static <E extends Element> List<E> listFilter(Iterable<? extends Element> elements,
                                                          Set<ElementKind> targetKinds,
                                                          Class<E> clazz) {
        List<E> list = new ArrayList<E>();
        for (Element e : elements) {
            if (targetKinds.contains(e.getKind()))
                list.add(clazz.cast(e));
        }
        return list;
    }

    // Assumes targetKinds and E are sensible.
    private static <E extends Element> Set<E> setFilter(Set<? extends Element> elements,
                                                        Set<ElementKind> targetKinds,
                                                        Class<E> clazz) {
        // Return set preserving iteration order of input set.
        Set<E> set = new LinkedHashSet<E>();
        for (Element e : elements) {
            if (targetKinds.contains(e.getKind()))
                set.add(clazz.cast(e));
        }
        return set;
    }
}

总体说来,该类首先声明了5个set,分别对应构造器,字段,方法,包,类型.然后针对这5种类型的过滤分别声明了2种类型的api,一种是针对Iterable,一种是针对Set.方法的实现还是比较简单的…属于一看就懂的…

猜你喜欢

转载自blog.csdn.net/qq_26000415/article/details/82383378