All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fasterxml.jackson.databind.introspect.AnnotatedMember Maven / Gradle / Ivy

There is a newer version: 0.10.0
Show newest version
package com.fasterxml.jackson.databind.introspect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Member;
import java.util.Collections;

import com.fasterxml.jackson.databind.util.ClassUtil;

/**
 * Intermediate base class for annotated entities that are members of
 * a class; fields, methods and constructors. This is a superset
 * of things that can represent logical properties as it contains
 * constructors in addition to fields and methods.
 */
public abstract class AnnotatedMember
    extends Annotated
    implements java.io.Serializable
{
    private static final long serialVersionUID = 1L; // since 2.5

    // 19-Dec-2014, tatu: Similarly, assumed NOT to be needed in cases where
    //    owning object (ObjectMapper or relatives) is being JDK-serialized
    /**
     * Class that was resolved to produce this member instance; either class that declared
     * the member, or one of its subtypes that inherited it.
     * 
     * @since 2.5
     */
    protected final transient AnnotatedClass _context;

    // Transient since information not needed after construction, so
    // no need to persist
    protected final transient AnnotationMap _annotations;

    /*
    @Deprecated // since 2.5
    protected AnnotatedMember(AnnotationMap annotations) {
        this(null, annotations);
    }
    */

    protected AnnotatedMember(AnnotatedClass ctxt, AnnotationMap annotations) {
        super();
        _context = ctxt;
        _annotations = annotations;
    }

    /**
     * Copy-constructor.
     *
     * @since 2.5
     */
    protected AnnotatedMember(AnnotatedMember base) {
        _context = base._context;
        _annotations = base._annotations;
    }
    
    /**
     * Actual physical class in which this memmber was declared.
     * Note that this may be different from what {@link #getContextClass()} returns;
     * "owner" may be a sub-type of "declaring class".
     */
    public abstract Class getDeclaringClass();

    public abstract Member getMember();

    /**
     * Accessor for {@link AnnotatedClass} that was the type that was resolved
     * and that contains this member: this is either the {@link java.lang.Class}
     * in which member was declared, or one of its super types. If distinction
     * between result type, and actual class in which declaration was found matters,
     * you can compare return value to that of {@link #getDeclaringClass()}.
     * The main use for this accessor is (usually) to access class annotations.
     *

* Also note that owner property is NOT (JDK-)serialized; this should usually not * matter, but means that while it is accessible during construction of various * (de)serializers, it may not be available on per-call basis, if (but only if) * ObjectMapper (etc) has been serialized/deserialized. * * @since 2.5 */ public AnnotatedClass getContextClass() { return _context; } @Override public Iterable annotations() { if (_annotations == null) { return Collections.emptyList(); } return _annotations.annotations(); } @Override protected AnnotationMap getAllAnnotations() { return _annotations; } /** * Method called to override an annotation, usually due to a mix-in * annotation masking or overriding an annotation 'real' constructor * has. */ public final boolean addOrOverride(Annotation a) { return _annotations.add(a); } /** * Method called to augment annotations, by adding specified * annotation if and only if it is not yet present in the * annotation map we have. */ public final boolean addIfNotPresent(Annotation a) { return _annotations.addIfNotPresent(a); } /** * Method that can be called to modify access rights, by calling * {@link java.lang.reflect.AccessibleObject#setAccessible} on * the underlying annotated element. */ public final void fixAccess() { ClassUtil.checkAndFixAccess(getMember()); } /** * Optional method that can be used to assign value of * this member on given object, if this is a supported * operation for member type. *

* This is implemented for fields and single-argument * member methods; but not for constructor parameters or * other types of methods (like static methods) */ public abstract void setValue(Object pojo, Object value) throws UnsupportedOperationException, IllegalArgumentException; /** * Optional method that can be used to access the value of * this member on given object, if this is a supported * operation for member type. *

* This is implemented for fields and no-argument * member methods; but not for constructor parameters or * other types of methods (like static methods) */ public abstract Object getValue(Object pojo) throws UnsupportedOperationException, IllegalArgumentException; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy