FileDocCategorySizeDatePackage
AnnotationUtils.javaAPI DocAndroid 5.1 API9067Thu Mar 12 22:18:30 GMT 2015com.android.dexgen.dex.file

AnnotationUtils

public final class AnnotationUtils extends Object
Utility class for dealing with annotations.

Fields Summary
private static final com.android.dexgen.rop.cst.CstType
ANNOTATION_DEFAULT_TYPE
{@code non-null;} type for {@code AnnotationDefault} annotations
private static final com.android.dexgen.rop.cst.CstType
ENCLOSING_CLASS_TYPE
{@code non-null;} type for {@code EnclosingClass} annotations
private static final com.android.dexgen.rop.cst.CstType
ENCLOSING_METHOD_TYPE
{@code non-null;} type for {@code EnclosingMethod} annotations
private static final com.android.dexgen.rop.cst.CstType
INNER_CLASS_TYPE
{@code non-null;} type for {@code InnerClass} annotations
private static final com.android.dexgen.rop.cst.CstType
MEMBER_CLASSES_TYPE
{@code non-null;} type for {@code MemberClasses} annotations
private static final com.android.dexgen.rop.cst.CstType
SIGNATURE_TYPE
{@code non-null;} type for {@code Signature} annotations
private static final com.android.dexgen.rop.cst.CstType
THROWS_TYPE
{@code non-null;} type for {@code Throws} annotations
private static final com.android.dexgen.rop.cst.CstUtf8
ACCESS_FLAGS_UTF
{@code non-null;} the UTF-8 constant {@code "accessFlags"}
private static final com.android.dexgen.rop.cst.CstUtf8
NAME_UTF
{@code non-null;} the UTF-8 constant {@code "name"}
private static final com.android.dexgen.rop.cst.CstUtf8
VALUE_UTF
{@code non-null;} the UTF-8 constant {@code "value"}
Constructors Summary
private AnnotationUtils()
This class is uninstantiable.


             
      
        // This space intentionally left blank.
    
Methods Summary
public static com.android.dexgen.rop.annotation.AnnotationmakeAnnotationDefault(com.android.dexgen.rop.annotation.Annotation defaults)
Constructs a standard {@code AnnotationDefault} annotation.

param
defaults {@code non-null;} the defaults, itself as an annotation
return
{@code non-null;} the constructed annotation

        Annotation result = new Annotation(ANNOTATION_DEFAULT_TYPE, SYSTEM);

        result.put(new NameValuePair(VALUE_UTF, new CstAnnotation(defaults)));
        result.setImmutable();
        return result;
    
private static com.android.dexgen.rop.cst.CstArraymakeCstArray(com.android.dexgen.rop.type.TypeList types)
Converts a {@link TypeList} to a {@link CstArray}.

param
types {@code non-null;} the type list
return
{@code non-null;} the corresponding array constant

        int size = types.size();
        CstArray.List list = new CstArray.List(size);

        for (int i = 0; i < size; i++) {
            list.set(i, CstType.intern(types.getType(i)));
        }

        list.setImmutable();
        return new CstArray(list);
    
public static com.android.dexgen.rop.annotation.AnnotationmakeEnclosingClass(com.android.dexgen.rop.cst.CstType clazz)
Constructs a standard {@code EnclosingClass} annotation.

param
clazz {@code non-null;} the enclosing class
return
{@code non-null;} the annotation

        Annotation result = new Annotation(ENCLOSING_CLASS_TYPE, SYSTEM);

        result.put(new NameValuePair(VALUE_UTF, clazz));
        result.setImmutable();
        return result;
    
public static com.android.dexgen.rop.annotation.AnnotationmakeEnclosingMethod(com.android.dexgen.rop.cst.CstMethodRef method)
Constructs a standard {@code EnclosingMethod} annotation.

param
method {@code non-null;} the enclosing method
return
{@code non-null;} the annotation

        Annotation result = new Annotation(ENCLOSING_METHOD_TYPE, SYSTEM);

        result.put(new NameValuePair(VALUE_UTF, method));
        result.setImmutable();
        return result;
    
public static com.android.dexgen.rop.annotation.AnnotationmakeInnerClass(com.android.dexgen.rop.cst.CstUtf8 name, int accessFlags)
Constructs a standard {@code InnerClass} annotation.

param
name {@code null-ok;} the original name of the class, or {@code null} to represent an anonymous class
param
accessFlags the original access flags
return
{@code non-null;} the annotation

        Annotation result = new Annotation(INNER_CLASS_TYPE, SYSTEM);
        Constant nameCst =
            (name != null) ? new CstString(name) : CstKnownNull.THE_ONE;

        result.put(new NameValuePair(NAME_UTF, nameCst));
        result.put(new NameValuePair(ACCESS_FLAGS_UTF,
                        CstInteger.make(accessFlags)));
        result.setImmutable();
        return result;
    
public static com.android.dexgen.rop.annotation.AnnotationmakeMemberClasses(com.android.dexgen.rop.type.TypeList types)
Constructs a standard {@code MemberClasses} annotation.

param
types {@code non-null;} the list of (the types of) the member classes
return
{@code non-null;} the annotation

        CstArray array = makeCstArray(types);
        Annotation result = new Annotation(MEMBER_CLASSES_TYPE, SYSTEM);
        result.put(new NameValuePair(VALUE_UTF, array));
        result.setImmutable();
        return result;
    
public static com.android.dexgen.rop.annotation.AnnotationmakeSignature(com.android.dexgen.rop.cst.CstUtf8 signature)
Constructs a standard {@code Signature} annotation.

param
signature {@code non-null;} the signature string
return
{@code non-null;} the annotation

        Annotation result = new Annotation(SIGNATURE_TYPE, SYSTEM);

        /*
         * Split the string into pieces that are likely to be common
         * across many signatures and the rest of the file.
         */

        String raw = signature.getString();
        int rawLength = raw.length();
        ArrayList<String> pieces = new ArrayList<String>(20);

        for (int at = 0; at < rawLength; /*at*/) {
            char c = raw.charAt(at);
            int endAt = at + 1;
            if (c == 'L") {
                // Scan to ';' or '<'. Consume ';' but not '<'.
                while (endAt < rawLength) {
                    c = raw.charAt(endAt);
                    if (c == ';") {
                        endAt++;
                        break;
                    } else if (c == '<") {
                        break;
                    }
                    endAt++;
                }
            } else {
                // Scan to 'L' without consuming it.
                while (endAt < rawLength) {
                    c = raw.charAt(endAt);
                    if (c == 'L") {
                        break;
                    }
                    endAt++;
                }
            }

            pieces.add(raw.substring(at, endAt));
            at = endAt;
        }

        int size = pieces.size();
        CstArray.List list = new CstArray.List(size);

        for (int i = 0; i < size; i++) {
            list.set(i, new CstString(pieces.get(i)));
        }

        list.setImmutable();

        result.put(new NameValuePair(VALUE_UTF, new CstArray(list)));
        result.setImmutable();
        return result;
    
public static com.android.dexgen.rop.annotation.AnnotationmakeThrows(com.android.dexgen.rop.type.TypeList types)
Constructs a standard {@code Throws} annotation.

param
types {@code non-null;} the list of thrown types
return
{@code non-null;} the annotation

        CstArray array = makeCstArray(types);
        Annotation result = new Annotation(THROWS_TYPE, SYSTEM);
        result.put(new NameValuePair(VALUE_UTF, array));
        result.setImmutable();
        return result;