/*
 * Copyright 2014 - 2020 Rafael Winterhalter
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.bytebuddy.implementation.attribute;

import net.bytebuddy.description.annotation.AnnotationDescription;
import net.bytebuddy.description.field.FieldDescription;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.RecordComponentDescription;
import net.bytebuddy.description.type.TypeDescription;

An annotation value filter is responsible for determining which values should be skipped and rather be represented as an annotation type's default values when writing an annotation to a class file.
/** * An annotation value filter is responsible for determining which values should be skipped and rather be represented as an * annotation type's default values when writing an annotation to a class file. */
public interface AnnotationValueFilter {
Checks if the given annotation value should be written as the value of the provided annotation property.
Params:
  • annotationDescription – The annotation value that is being written.
  • methodDescription – The annotation method of which a value is being written.
Returns:true if the value should be written to the annotation.
/** * Checks if the given annotation value should be written as the value of the provided annotation property. * * @param annotationDescription The annotation value that is being written. * @param methodDescription The annotation method of which a value is being written. * @return {@code true} if the value should be written to the annotation. */
boolean isRelevant(AnnotationDescription annotationDescription, MethodDescription.InDefinedShape methodDescription);
A factory for creating an annotation value filter for an annotation's target.
/** * A factory for creating an annotation value filter for an annotation's target. */
interface Factory {
Creates an annotation value filter for writing annotations on an instrumented type.
Params:
  • instrumentedType – The instrumented type onto which the annotations are written.
Returns:An annotation value filter to be used when writing annotations onto the given type.
/** * Creates an annotation value filter for writing annotations on an instrumented type. * * @param instrumentedType The instrumented type onto which the annotations are written. * @return An annotation value filter to be used when writing annotations onto the given type. */
AnnotationValueFilter on(TypeDescription instrumentedType);
Creates an annotation value filter for writing annotations on a field.
Params:
  • fieldDescription – The field onto which the annotations are written.
Returns:An annotation value filter to be used when writing annotations onto the given field.
/** * Creates an annotation value filter for writing annotations on a field. * * @param fieldDescription The field onto which the annotations are written. * @return An annotation value filter to be used when writing annotations onto the given field. */
AnnotationValueFilter on(FieldDescription fieldDescription);
Creates an annotation value filter for writing annotations on a method.
Params:
  • methodDescription – The method onto which the annotations are written.
Returns:An annotation value filter to be used when writing annotations onto the given method.
/** * Creates an annotation value filter for writing annotations on a method. * * @param methodDescription The method onto which the annotations are written. * @return An annotation value filter to be used when writing annotations onto the given method. */
AnnotationValueFilter on(MethodDescription methodDescription);
Creates an annotation value filter for writing annotations on a record component.
Params:
  • recordComponentDescription – The record component onto which the annotations are written.
Returns:An annotation value filter to be used when writing annotations onto the given record component.
/** * Creates an annotation value filter for writing annotations on a record component. * * @param recordComponentDescription The record component onto which the annotations are written. * @return An annotation value filter to be used when writing annotations onto the given record component. */
AnnotationValueFilter on(RecordComponentDescription recordComponentDescription); }
A default implementation of an annotation value filter that applies the same strategy for any type, field or method.
/** * A default implementation of an annotation value filter that applies the same strategy for any type, field or method. */
enum Default implements AnnotationValueFilter, Factory {
An annotation value filter where default values are skipped and not included in the class file.
/** * An annotation value filter where default values are skipped and not included in the class file. */
SKIP_DEFAULTS {
{@inheritDoc}
/** {@inheritDoc} */
public boolean isRelevant(AnnotationDescription annotationDescription, MethodDescription.InDefinedShape methodDescription) { Object defaultValue = methodDescription.getDefaultValue(); return defaultValue == null || !defaultValue.equals(annotationDescription.getValue(methodDescription)); } },
An annotation value filter where default values are included in the class file.
/** * An annotation value filter where default values are included in the class file. */
APPEND_DEFAULTS {
{@inheritDoc}
/** {@inheritDoc} */
public boolean isRelevant(AnnotationDescription annotationDescription, MethodDescription.InDefinedShape methodDescription) { return true; } };
{@inheritDoc}
/** * {@inheritDoc} */
public AnnotationValueFilter on(TypeDescription instrumentedType) { return this; }
{@inheritDoc}
/** * {@inheritDoc} */
public AnnotationValueFilter on(FieldDescription fieldDescription) { return this; }
{@inheritDoc}
/** * {@inheritDoc} */
public AnnotationValueFilter on(MethodDescription methodDescription) { return this; }
{@inheritDoc}
/** * {@inheritDoc} */
public AnnotationValueFilter on(RecordComponentDescription recordComponentDescription) { return this; } } }